试图在例子中承担词汇范围

时间:2016-09-15 12:15:17

标签: javascript

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}}?

引用一本已知的书:

  

无论调用函数的位置,甚至调用它的方式,   它的词法范围仅由声明函数的位置定义

2 个答案:

答案 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可能值得一读,它在一开始就显示了一个非常奇特的例子。