在对象方法中this就是指该对象
var obj = { name: 'xin', getName: function () { return this.name; } }; console.log(obj.getName()); //xin作为普通函数调用时指向全局对象,被全局对象调用指向全局对象,当查找不到this也指向全局对象
window.name = 'xin'; function getName() { console.log(this.name); } getName(); //xin上诉过程就是普通函数的调用也可以看作是全局对象对该函数的一次调用window.getName();
window.name = "xin"; var myObject = { name: 'bing', getName: function () { return this.name; } }; console.log(myObject.getName()); //bing var newfunc = myObject.getName; console.log(newfunc()); //xin虽然上述函数是对象的函数,但是被重新赋值后变成了被全局作用域调用
<body> <div id="div1">这是一个div</div> </body> <script> window.id = "window"; document.getElementById("div1").onclick = function () { console.log(this.id); //div1 var callback = function () { console.log(this.id); //window }; callback(); } </script>在这个例子中,内部函数callback找不到this,就将this指向全局域的window。
构造器this指向创建的对象或明确{}返回的对象
var myClass = function () { this.name = 'xin'; }; var obj = new myClass(); console.log(obj.name);构造器中显示的返回对象
var myClass = function () { var name = 'xin'; return { name: 'bing' }; }; var obj = new myClass(); console.log(obj.name); //bing构造器中返回的不是{}对象,this将明确指向创建对象
var myClass = function () { this.name = 'xin'; return 'bing'; }; var obj = new myClass(); console.log(obj.name); //xincall和apply中的this将指向动态传递过来的对象
var obj1 = { name: 'xin', getName: function () { return this.name; } }; var obj2 = { name: 'bing' }; console.log(obj1.getName()); //xin console.log(obj1.getName.call(obj2)); //bing