当代码中有另一个不相关的函数时,"不是函数"错误

zlo*_*leo 4 javascript this anonymous-function

我有两段代码,每个代码都按预期工作:

function Test() {}

let tmp = function() {
    console.log(this)
}
tmp.call(Test)
Run Code Online (Sandbox Code Playgroud)

function Test() {}

(function() {
    console.log(this)
}).call(Test)
Run Code Online (Sandbox Code Playgroud)

它们都产生预期的输出:[Function: Test].

但是,当组合这些独立的代码片段时,会产生错误.所以,运行以下代码

function Test() {}

let tmp = function() {
    console.log(this)
}
tmp.call(Test)

(function() {
    console.log(this)
}).call(Test)
Run Code Online (Sandbox Code Playgroud)

结果是

TypeError: tmp.call(...) is not a function
Run Code Online (Sandbox Code Playgroud)

我找到了一个非优雅的解决方案,这为第二个代码片段添加了一个延迟.因此,以下将产生所需的输出([Function: Test]两次):

function Test() {}

let tmp = function() {
    console.log(this)
}
tmp.call(Test)

setTimeout(() => {
    (function() {
        console.log(this)
    }).call(Test)
}, 100);
Run Code Online (Sandbox Code Playgroud)

该超时似乎解决它这一事实使我认为这是相关的一些异步的东西,但我无法解释究竟为什么发生.

Poi*_*nty 9

你是一个自动分号插入陷阱的受害者.代码

tmp.call(Test)

(function() {
    console.log(this)
}).call(Test)
Run Code Online (Sandbox Code Playgroud)

被解释为好像是写的

tmp.call(Test)(function() { console.log(this) }).call(Test)
Run Code Online (Sandbox Code Playgroud)

如果引入分号:

tmp.call(Test);

(function() {
    console.log(this)
}).call(Test)
Run Code Online (Sandbox Code Playgroud)

然后它会工作.

精确的规则涉及一些有些难以消化的"法律术语",但基本思想(在这种情况下)是当表达式在语法上可以作为简单的空格字符时在语法上起作用时不会插入分号.

  • 我永远不会明白为什么人们想要摆脱分号; (2认同)
  • @ zero298因为有些人不断在不使用它们的语言之间切换,JS甚至没有警告缺少分号. (2认同)