gpt4 book ai didi

javascript - 为什么调用该函数? JavaScript/窗口

转载 作者:数据小太阳 更新时间:2023-10-29 05:42:39 32 4
gpt4 key购买 nike

我的 HTML 文件中有以下代码:

    <script type="text/javascript">
window.never = function() {
console.log('this function is never called');
}
(function(d, s, id){
var js, srjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = "this.script.does.not.exist.js";
srjs.parentNode.insertBefore(js, srjs);
}(document, 'script', 'streamrail-jssdk'));
</script>

参见 fiddle :http://jsfiddle.net/sebvaeja/

查看控制台,您可以看到 window.never 函数实际上被调用了('this function is never called' 被写入控制台)。

当使用 Chrome 开发工具对此进行调试时,我在调用堆栈中看到调用者是闭包(第一行:http://jsfiddle.net/sebvaeja/)。

如果我将 never 函数更改为不在全局范围内:

    function never() {
console.log('this function is never called');
}

那么它就不会被调用。

有人能解释一下为什么调用 window.never 函数吗?是什么触发了调用?我想这与窗口对象上的函数有关,但我看不出这背后的原因。

最佳答案

函数表达式后跟括号:

 window.never = function() { ... }
(...)

函数表达式后的换行符不会终止变量语句,因此对于函数调用的解析器:

function() { ... }(...)

事实上,您在这里使用的是完全相同的技术:

(function(d, s, id){
// ...
}(document, 'script', 'streamrail-jssdk'))

这是一个函数表达式,后跟 (...) 并调用该函数。

解决方法:在定义后加一个分号即可。


If I change the never function to be off the global scope ... Then it is not being called.

在那种情况下,函数定义被解释为函数声明,而不是表达式。函数声明更像是一个语句,因此不能是 CallExpression 的一部分。因此,以下括号被解释为分组运算符(如您所愿)。

关于javascript - 为什么调用该函数? JavaScript/窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32788303/

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