var carlike = function(obj, loc){
obj.loc = loc;
obj.move = move;
return obj;
};
var move = function(){
this.loc++;
};
var ben = carlike({}, 9);
在上面的示例中,obj.move
函数中的carlike
如何在move
函数声明carlike
函数后声明,ben.move();
函数是否可以访问undefined
函数。换句话说,当我最后致电{{1}}时,为什么它不会返回{{1}}?
引用一本已知的书:
无论调用函数的位置,甚至调用它的方式, 它的词法范围仅由声明函数的位置定义
答案 0 :(得分:1)
这不是一个范围问题。函数中的代码不必引用move
,直到实际调用它为止。在 move
初始化之后发生了这种情况,因此它可以正常工作。
carlike
内的代码确实包含对move
的引用,并且在构造函数时是,move
的值未设置。然而,这并不重要;当稍后调用该函数时,将设置move
的值。如果您在ben
的初始化之前将move
的初始化移动到,则代码将无效。
答案 1 :(得分:1)
好吧,由于提升您的代码将等于:
var carlike, move, ben;
carlike = function(obj, loc){
obj.loc = loc;
obj.move = move;
return obj;
};
move = function(){
this.loc++;
};
ben = carlike({}, 9);
现在由于关闭,carlike
可以访问move
。
This可能值得一读,它在一开始就显示了一个非常奇特的例子。