Javascript 试图理解示例中的词法范围
在上面的示例中,Javascript 试图理解示例中的词法范围,javascript,Javascript,在上面的示例中,carlike函数中的obj.move如何能够访问move函数,即使它是在carlike函数声明之后声明的。换句话说,当我调用ben.move()时在结尾为什么不返回未定义的 引用一本已知的书: 无论函数从何处调用,甚至是如何调用, 其词法范围仅由函数的声明位置定义 这实际上不是一个范围问题。函数中的代码在实际调用之前不必引用move。这发生在move初始化之后,因此它可以工作 carlike中的代码确实包含对move的引用,并且在构建函数时,没有设置move的值。然而,这并不重
carlike
函数中的obj.move
如何能够访问move
函数,即使它是在carlike
函数声明之后声明的。换句话说,当我调用ben.move()时代码>在结尾为什么不返回未定义的
引用一本已知的书:
无论函数从何处调用,甚至是如何调用,
其词法范围仅由函数的声明位置定义
这实际上不是一个范围问题。函数中的代码在实际调用之前不必引用move
。这发生在move
初始化之后,因此它可以工作
carlike
中的代码确实包含对move
的引用,并且在构建函数时,没有设置move
的值。然而,这并不重要;稍后调用该函数时,将设置move
的值。如果将ben
的初始化移动到move
的初始化之前,则代码将无法工作。这实际上不是范围问题。函数中的代码在实际调用之前不必引用move
。这发生在move
初始化之后,因此它可以工作
carlike
中的代码确实包含对move
的引用,并且在构建函数时,没有设置move
的值。然而,这并不重要;稍后调用该函数时,将设置move
的值。如果将ben
的初始化移动到move
的初始化之前,则代码将不起作用。由于提升,代码将等于:
var carlike = function(obj, loc){
obj.loc = loc;
obj.move = move;
return obj;
};
var move = function(){
this.loc++;
};
var ben = carlike({}, 9);
现在由于关闭,carlike
可以访问move
可能值得一读,它在开头显示了一个非常特殊的示例。好吧,由于您的代码将等于:
var carlike = function(obj, loc){
obj.loc = loc;
obj.move = move;
return obj;
};
var move = function(){
this.loc++;
};
var ben = carlike({}, 9);
现在由于关闭,carlike
可以访问move
可能值得一读,它在开头显示了一个非常特殊的示例。请参阅。@haim770但这些是函数表达式,不是声明。因此它们不会被提升。@Yapartase,即使move
变量是在carlike
函数之后声明的,它仍然可以访问,因为声明是被提升的。至于变量的值,它也是在调用carlike
之前初始化的。请参阅。@haim770,但这些是函数表达式,不是声明。因此它们不会被提升。@Yapartase,即使move
变量是在carlike
函数之后声明的,它仍然可以访问,因为声明是被提升的。至于变量的值,它也是在调用carlike
之前初始化的。据我所知,闭包确保函数能够访问其外部变量环境,即使在其包含的函数弹出执行堆栈之后也是如此。但是我不明白这是怎么回事?@Yapartase yeap,我不完全确定这个例子也被称为“闭包”,但是,你可以这样说:如果变量没有在函数中声明,解释器在外部作用域中查找这样的变量声明,直到它到达全局作用域或找到一个声明并使用相应的值为止。闭包有点让我发火。据我所知,闭包确保函数能够访问其外部变量环境,即使在其包含的函数弹出执行堆栈之后也是如此。但是我不明白这是怎么回事?@Yapartase yeap,我不完全确定这个例子也被称为“闭包”,但是,你可以这样说:如果变量没有在函数中声明,解释器在外部范围中查找这样的变量声明,直到它到达全局范围或找到声明并使用相应的值为止。