gpt4 book ai didi

javascript - 在现代浏览器中有条件地定义函数?特别是 Safari ?

转载 作者:行者123 更新时间:2023-11-29 20:48:59 24 4
gpt4 key购买 nike

有条件地为流行的现代浏览器定义函数的最佳方法是什么?

我看到 Safari 12(iOS 12.0.1 和 macOS 10.14)错误地定义了条件函数,而 Chrome、Firefox、Edge 似乎做了正确的事情。此外,JS 引擎的规范正确行为是什么,所以如果它是一个错误,我可以向 Apple 报告这个错误。

背景:我们这样做是为了避免在用户不同意 GDPR 的情况下加载 Google Analytics (gtag.js)。 Google 的 gtags.js 样板初始化代码有一行 function gtag(){dataLayer.push(arguments);} 触发 Safari。

下面的代码,演示地址 JS Fiddle here

<html>
<head>
<title>Safari JS engine test</title>
<script type="text/javascript">
if (false) {
function conditionalFunctionality() {
alert("Doing conditional functionality");
}
}
window.onload = function() {
if (typeof conditionalFunctionality === "function") {
alert("BAD. It's defined");
} else {
alert("GOOD. It's NOT defined");
}
}
</script>
</head>
<body>
<h1>Safari JS engine test</h1>
</body>
</html>

面部照片

iOS macOS

最佳答案

如上面的评论所述,当函数定义不是“顶级”时,它们的行为可能不直观。例如:

a()
function a() { console.log("here"); }

即使函数定义在使用后出现,也会记录到控制台。这在 Javascript 中称为提升,这里有一个很好的描述:

https://gomakethings.com/function-expressions-vs-function-declarations/

(由 pointy 提供)

不同的浏览器版本以不同的方式执行此提升,导致您观察到的不一致以及为什么“严格”模式(即代码块顶部的 “use strict”; 会改变此行为).

当我想要获得这样的行为时,我倾向于使用“函数表达式”。哪个看起来更像这样:

var conditionalFunctionality;
if (false) {
conditionalFunctionality = function () {
console.log("conditionally defined");
}
}
if (conditionalFunctionality) {
conditionalFunctionality();
}

它还具有适当的自然“虚假”变量的优势,并且不需要玩任何 typeof conditionalFunctionality === "function" 游戏。

关于javascript - 在现代浏览器中有条件地定义函数?特别是 Safari ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52897633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com