JS:嵌套函数获取外部函数参数的副本?

Cod*_*ith 3 javascript scope nested-function

因此,通过以下代码,我向自己证明了嵌套函数确实获得了外部函数的参数的副本:

    var o = {};
    (function(a,b,c,x){
        x.f = function(){
            return a.toString()+b.toString()+c.toString();
        }
    })(7,4,2,o);
    o.f();
Run Code Online (Sandbox Code Playgroud)

代码产生

    742
Run Code Online (Sandbox Code Playgroud)

这意味着该o.f函数从匿名函数中获取a,b和c的副本.否则,我会得到undefinedundefinedundefined

我的问题是,

  • 首先,这总是如此吗?还是有严格的情况?(比如,它必须是一个对象吗?等)
  • 另外,在javascript中还有哪些其他类型的模糊范围?我很想知道(即第三次迭代怎么样?)
  • 最后,我完全可以阅读一篇阐述javascript范围高级概念的文档.有谁知道任何好的?

Nat*_*all 9

你观察到的是词法范围.这意味着JavaScript中某个范围内变量的绑定取决于变量在代码中的显示位置.它总是如此,并且在任何级别都是如此.唯一的主要例外是this值,它是动态范围而不是词法范围.动态范围意味着函数中的变量取决于函数的调用方式和时间.(参见词汇范围和动态范围.)

例:

var o = { 
    a: function() {
        var x = 5;
        console.log(this, x);
        function b() {
            console.log(this, x);
        }
        b();
    }
};

o.a();
Run Code Online (Sandbox Code Playgroud)

这个例子的结果将是:

{Object o} 5
{window} 5
Run Code Online (Sandbox Code Playgroud)

换句话说,第一个console.log将记录thiso对象的引用,而第二个console.log将记录thiswindow对象的引用.但是,两者都会记录x为等于5.值的值thiswindow在没有上下文的情况下以非严格模式调用它.所以this不是词法上的范围,而是其他变量,例如x.要阅读更多有关行为的信息,this请参阅简短概述this.


直接回答您的问题:

1.首先,这总是如此吗?还是有严格的情况?(比如,它必须是一个对象吗?等)

是的,它的除外真实thisarguments基于功能是如何调用它的变化.它不必是一个对象,所有变量都是词法范围的.


2.此外,在javascript中还有哪些其他类型的模糊范围?我很想知道(即第三次迭代怎么样?)

你可以尽可能深入 - 内部函数总是可以访问其外部函数的变量.

function a() {
    var x = 1;
    console.log('a:', x);
    return function b() {
        var y = 2;
        console.log('b:', x, y);
        return function c() {
            console.log('c:', x, y);
        };
    };
}

var foo = a();   // => logs 'a: 1'
var bar = foo(); // => logs 'b: 1 2'
bar();           // => logs 'c: 1 2'
Run Code Online (Sandbox Code Playgroud)

这实际上是另一个被称为闭包的主题的一部分,当从另一个函数中返回一个函数时会发生这种情况.


3.最后,我完全可以阅读一篇阐述javascript范围高级概念的文档.有谁知道任何好的?

我已经链接了几个资源.另一个好的:

MDN:函数和函数作用域(特别是有关嵌套函数和闭包的部分).

此外,您将从阅读任何关于闭包的内容中受益,您可能还想查找词法范围.