Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 试图理解示例中的词法范围_Javascript - Fatal编程技术网

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,我不完全确定这个例子也被称为“闭包”,但是,你可以这样说:如果变量没有在函数中声明,解释器在外部范围中查找这样的变量声明,直到它到达全局范围或找到声明并使用相应的值为止。