【发布时间】:2019-07-31 01:29:51
【问题描述】:
我有:
// Shouldn't we have the following hoisted?
// var multiply; (undefined)
// var add; (undefined)
var multiply = function(num) {
return add(num) * 2;
};
var add = function(num) {
return num + 1;
};
console.log(multiply(1)); // No error, somehow "multiply" calls "add"!
我认为 JavaScript 变量被提升到顶部,而不是它们被分配的值。不知何故,multiply 调用 add 不会返回错误,即使 add 声明在 multiply 之下。
【问题讨论】:
-
我认为是这样,基于我对阅读此blog.bitsrc.io/… 的公认有缺陷的记忆,这可能会比您想知道的更多。我记得的基础知识包括每个函数都有自己的执行上下文,其中包括几个内部词法环境(其中一个特定于那些用
var声明的标识符)并且这些词法环境可以访问外部环境。另外,我认为var和function声明会被提升,但let和const声明不会...... -
解释很简单。 JS 让你的函数引用不存在的变量。因此,只有在调用函数之后才会出现错误的可能性。在调用时,如果引用的变量不存在,则会出现错误。作为测试,删除
add()函数,并更新multiply(),使其使用try/catch,其中try尝试调用add(),catch在window.add = function() {...}创建它。您会看到 ReferenceError 在第一次调用时被捕获,但后续调用成功。 -
...像这样:jsfiddle.net/cpzj309w
标签: javascript function scope hoisting lexical