我注意到,似乎没有明确解释this关键字是什么以及如何在Stack Overflow站点上的JavaScript中正确(和错误地)使用它.
我亲眼目睹了一些非常奇怪的行为,并且无法理解为什么会发生这种行为.
this工作如何以及何时使用?
我刚刚this在NodeJS环境中看到了关键字的奇怪行为.我用代码列出它们.我NodeJS v6.x用一个JavaScript文件运行这些代码.
在使用以下一行代码进行测试时,无论是否使用该'use strict'语句,都指向一个空对象{}.
console.log(this)
Run Code Online (Sandbox Code Playgroud)
但是,当我在自执行函数中运行语句时,
(function(){
console.log(this);
}());
Run Code Online (Sandbox Code Playgroud)
它正在打印一个非常大的对象.在我看来环境创建的全局执行上下文对象NodeJS.
在使用'use strict'语句执行上述功能时,预计会打印undefined
(function(){
'use strict';
console.log(this);
}());
Run Code Online (Sandbox Code Playgroud)
但是,在使用浏览器(我只测试过Chrome)时,前三个示例产生window对象,最后一个示例undefined按预期方式给出.
浏览器的行为是可以理解的.但是,如果是NodeJS,它不会创建执行上下文,直到我在函数内部包装?
那么,大多数代码NodeJS运行时都是空的全局 object?
当我在node.js中键入它时,我得到了undefined.
var testContext = 15;
function testFunction() {
console.log(this.testContext);
}
testFunction();
=>undefined
Run Code Online (Sandbox Code Playgroud)
没有var关键字,它传递(=> 15).它在Chrome控制台中运行(有和没有var关键字).
如何在NodeJS中创建动态变量名?一些例子说要存储在window变量中,但我假设这是客户端Javascript.如我错了请纠正我.
假设我在对象中有以下属性方法:
onReady: function FlashUpload_onReady()
{
Alfresco.util.Ajax.jsonGet({
url: Alfresco.constants.PROXY_URI + "org/app/classification",
successCallback: {
fn: function (o) {
var classButtonMenu = [],
menuLabel, that = this;
var selectButtonClick = function (p_sType, p_aArgs, p_oItem) {
var sText = p_oItem.cfg.getProperty("text");
that.classificationSelectButton.set("label", sText);
};
for (var i in o.json.items) {
classButtonMenu.push({
text: o.json.items[i].classification,
value: o.json.items[i].filename,
onClick: {fn: selectButtonClick}
});
}
this.classificationSelectButton = new YAHOO.widget.Button({
id: this.id + "-appClassification",
type: "menu",
label: classButtonMenu[0].text,
name: "appClassification",
menu: classButtonMenu,
container: this.id + "-appClassificationSection-div"
});
},
scope: this
}, …Run Code Online (Sandbox Code Playgroud) 我有一个这样的脚本:
var test = function(){
console.log('From test: ' + this);
};
console.log(this);
test();
Run Code Online (Sandbox Code Playgroud)
我运行的是哪个node test.js.而我对脚本的期望是this指向全局对象,但只有this测试函数指向global对象.
console.log(this);实际上指向一个空对象.
我试图理解为什么node.js有这种行为,我误解了this关键字如何在node.js中工作.
我已经更新了我Node.Js进入version 7.6.0和运行谷歌浏览器version 57.0的另一方面.
当我运行这段javascript代码时,我得到两个不同的结果,如下所示:
'use strict'
var obj = {
id: "awesome",
cool: function coolFn() {
console.log(this.id);
}
};
var id = "not awesome";
obj.cool(); //awsome
setTimeout(obj.cool, 100);Run Code Online (Sandbox Code Playgroud)
铬的结果:
awesome
not awesome
Run Code Online (Sandbox Code Playgroud)
node.js上的结果:
awesome
undefined
Run Code Online (Sandbox Code Playgroud)
记录到https://nodejs.org/en/docs/es6/我甚至使用了--harmony标志,但node.js的结果没有改变.
我有一个如下所示的简单代码并将其作为节点模块执行:
\n\nconsole.log(this);\nmodule.exports = {\xe2\x80\xa6};\nRun Code Online (Sandbox Code Playgroud)\n\n我知道这global是默认上下文(就像window在浏览器中一样),但是this关键字指的是什么呢?