Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.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_Node.js - Fatal编程技术网

考虑到JavaScript有闭包,这个关键字的确切用途是什么?

考虑到JavaScript有闭包,这个关键字的确切用途是什么?,javascript,node.js,Javascript,Node.js,给定以下代码,我们可以看到闭包有助于在其作用域内包含变量的值: var f = new Foo('jim','jam'); var b = new Bar('saul','paul'); var bz = new Baz(); function Foo(jim,jam){ this.jim = jim; this.jam = jam; function log(){ console.log('jim:',jim,'jam:',jam); }

给定以下代码,我们可以看到闭包有助于在其作用域内包含变量的值:

var f = new Foo('jim','jam');
var b = new Bar('saul','paul');
var bz = new Baz();

function Foo(jim,jam){

    this.jim = jim;
    this.jam = jam;

    function log(){
        console.log('jim:',jim,'jam:',jam);
    }

    return log;
}


function Bar(jim,jam){

    function log(){
        console.log('jim:',jim,'jam:',jam);
    }

    return log;
}

function Baz(jim,jam){

    this.jim = 'bark';
    this.jam = 'catch';


    function log(){
        console.log('jim:',this.jim,'jam:',this.jam);
    }

    return log;
}

f();
b();
bz();

那么,JavaScript中“
this
”关键字的确切用途是什么呢?什么时候需要?

当必须显式引用上下文对象时,
关键字是必需的。您的函数不是很好的示例,因为您对对象属性使用的名称与对函数参数使用的名称相同。如果你让他们与众不同,可能会更清楚:

function Foo(pjim, pjam){

    this.jim = pjim;
    this.jam = pjam;

    function log(){
        console.log('jim:',jim,'jam:',jam);
    }

    return log;
}

该版本基本上不起作用-名称“jim”和“jam”与
log
函数中的任何内容都不对应。

当必须显式引用上下文对象时,必须使用
关键字。您的函数不是很好的示例,因为您对对象属性使用的名称与对函数参数使用的名称相同。如果你让他们与众不同,可能会更清楚:

function Foo(pjim, pjam){

    this.jim = pjim;
    this.jam = pjam;

    function log(){
        console.log('jim:',jim,'jam:',jam);
    }

    return log;
}

该版本基本上不起作用-名称“jim”和“jam”与
log
函数中的任何内容都不对应。

关键字用于访问与当前范围不同的当前上下文


如果调用对象的方法,则该调用的上下文就是对象。您可以使用
this
关键字访问对象中的属性:

函数Foo(jim,jam){
这个.x=吉姆;
这个。y=果酱;
}
Foo.prototype.log=函数(){
document.write('jim:'+this.x+',jam:'+this.y);
};
var f=新Foo('jim','jam');

f、 log()
关键字用于访问与当前范围不同的当前上下文


如果调用对象的方法,则该调用的上下文就是对象。您可以使用
this
关键字访问对象中的属性:

函数Foo(jim,jam){
这个.x=吉姆;
这个。y=果酱;
}
Foo.prototype.log=函数(){
document.write('jim:'+this.x+',jam:'+this.y);
};
var f=新Foo('jim','jam');

f、 log()
this
关键字允许您将变量传递到函数的作用域中,而不将其作为函数中的参数。所以,如果我试图引用工厂中的窗口,而窗口不可用,我可以调用我的函数,比如
myClass['myfunction']像这样有效地传递窗口。很难说到底是什么让你困惑。局部变量作用域和闭包以及对象上下文之间确实没有太多的共同点。@有点重叠的是,通过从外部函数返回内部函数,您可以像引用实例一样引用这些变量variables@AlexMills代码引用的是参数,而不是对象属性。JavaScript从来没有隐式对象引用(除了在带有
语句块的
中,这些语句块已被弃用且怪异)。通过
this
关键字,可以将变量传递到函数的作用域中,而不必将其作为函数中的参数。所以,如果我试图引用工厂中的窗口,而窗口不可用,我可以调用我的函数,比如
myClass['myfunction']像这样有效地传递窗口。很难说到底是什么让你困惑。局部变量作用域和闭包以及对象上下文之间确实没有太多的共同点。@有点重叠的是,通过从外部函数返回内部函数,您可以像引用实例一样引用这些变量variables@AlexMills代码引用的是参数,而不是对象属性。JavaScript从来没有隐式对象引用(除了在带有语句块的
中,这些语句块不推荐使用,而且很奇怪)。