我注意到,似乎没有明确解释this关键字是什么以及如何在Stack Overflow站点上的JavaScript中正确(和错误地)使用它.
我亲眼目睹了一些非常奇怪的行为,并且无法理解为什么会发生这种行为.
this工作如何以及何时使用?
我刚刚在JavaScript中遇到了一个有趣的情况.我有一个类,其方法使用object-literal表示法定义多个对象.在这些对象中,this正在使用指针.从程序的行为,我推断出this指针指的是调用方法的类,而不是文字创建的对象.
这似乎是随意的,尽管这是我期望它工作的方式.这是定义的行为吗?跨浏览器安全吗?有没有任何理由可以解释为什么它超出"规范如此说明"的方式(例如,它是否是一些更广泛的设计决策/哲学的结果)?简化代码示例:
// inside class definition, itself an object literal, we have this function:
onRender: function() {
this.menuItems = this.menuItems.concat([
{
text: 'Group by Module',
rptletdiv: this
},
{
text: 'Group by Status',
rptletdiv: this
}]);
// etc
}
Run Code Online (Sandbox Code Playgroud) 我想使用一个对象作为函数参数。当我在 fucntion 之外定义一个对象然后将它作为参数传递时,它工作正常:
var obj = {
a: 0
}
function foo(obj){
console.log(this.obj.a);
}
foo() //0
Run Code Online (Sandbox Code Playgroud)
但是当我直接传递一个对象时,它不起作用:
function bar({a: 0}){
console.log(this.arguments.a)
}
// Uncaught SyntaxError: Unexpected number
Run Code Online (Sandbox Code Playgroud)
一个对象似乎是一个合法的论点。我如何解决它?
在consoleChrome开发人员工具的选项卡中,我输入了this,它显示了Window对象.如何this成为窗口对象?
console.log(this);Run Code Online (Sandbox Code Playgroud)
请考虑以下代码段
var firstname = "Javascript";
var lastname = "Lover - SKT";
function getName() {
this.firstname = "Sivakumar";
this.lastname = "Tadisetti";
}
console.log(firstname);
getName();
console.log(this.lastname); // How this.lastname is working here?Run Code Online (Sandbox Code Playgroud)
我已经阅读了以下StackOverflow答案
但是不明白上面的代码片段是如何工作的(我评论的那一行)
更新:
我在jsfiddle中尝试了上面的代码片段,其中输出this.firstname是未定义的.所以这就是我问这个问题的原因.但是在stackoverflow代码片段中,它运行正常