编程语言
首页 > 编程语言> > Javascript:使用“ this”访问“ private”子功能中的外部作用域变量时出现“ undefined”

Javascript:使用“ this”访问“ private”子功能中的外部作用域变量时出现“ undefined”

作者:互联网

我习惯于将所有变量设置为其父范围,而不是隐式调用它们:

function outer() {
    var x, y;
    function inner() {
        var x = this.x;
        x = ...// doing stuff here
        y = ....// implicit calling parent variable
    }
}

这样,如果我输错了变量,它就不会进入全局空间.但是似乎私有函数中的带有此变量的声明变量将使我返回未定义状态:

function f() {
    var x = [0];
    function f1() { 
        console.log('f1:', this.x, x); 
        f2(); 
    }
    function f2() { 
        console.log('f2:', this.x, x); 
    }
    return { x:x , f1:f1 };
}

var foo = f();    
foo.f1();
    //output
    f1: [0] [0]
    f2: undefined [0]

如果我正确理解它,就不会发生这种情况,因为f1和f2都应该使用此方法来访问其外部作用域.有什么我想念的概念吗?还是我现在只需要忍受呢?

更新:为了澄清,我主要关心的是为什么f1和f2之间存在差异.我更喜欢隐藏f2,因为它会做一些内部工作,而其他开发人员在从f()声明某些内容时不应使用它.

解决方法:

也尝试一下:

function f() {
    var x = [0];
    function f1() { 
        console.log('f1:', this.x, x); 
        f2.call(this); 
    }
    function f2() { 
        console.log('f2:', this.x, x); 
    }
    return { x:x , f1:f1 };
}

var foo = f();    
foo.f1();

这样,将正确设置f2的上下文.

在您的代码中,f2中的this引用了window对象,因为未将f2声明为方法.在编写{x:x,f1:f1}时,f1被声明为返回对象的方法.在f2中可见x并不是因为它在f()的范围内运行,而是因为f2作为闭包来获取它.这意味着在f2中,所有变量在创建时都将在同一范围内可见.

这指的是在调用时设置.如果您将函数作为foo.f1()之类的对象的属性运行,则它将被视为方法,并将其设置为该对象.但是,当您仅调用f2()之类的函数时,作用域将与在其中调用的作用域相同,在您的情况下,它是window对象,因为foo是window对象中的全局对象.

在f1中,这是指隐藏的f(),因此,如果您还希望在该范围内运行f2,则可以使用f2.call(this). .call()的参数在运行时将是函数的this.

标签:scope,this,javascript
来源: https://codeday.me/bug/20191031/1973299.html