普通函数的this是谁? window
对象.方法中的this是谁?当前的实例对象
定时器方法的this是谁?window
构造函数的this是谁?实例对象
原型对象的this是谁?实例对象
严格模式下的this,一定要指明是谁调用了他,谁调用了他,this就是谁,如何没有对象调用,则为undefined
注:所有自执行函数中,所有没有指定指向的this,都将指向window。
类似于下面
!function(){..........}();
~function(){..........}();
+function(){..........}();
-function(){..........}();
(function(){..........})();
都指向window
例题
var a = {
name:"zhang",
sayName:function(){
console.log("this.name="+this.name);
}
};
var name = "ling";
function sayName(){
var sss = a.sayName;
/*
function(){
console.log("this.name="+this.name);
}
*/
sss(); //this.name = ling
a.sayName(); //this.name = zhang
(a.sayName)(); //this.name = zhang
(b = a.sayName)();//this.name = ling
}
sayName();
var sex = "male";
var saySex = {
sex:"female",
saySex:function(){
function getSex(){
console.log("this.sex="+this.sex);
}
getSex();
}
}
saySex.saySex(); //this.sex = male
var ccc = saySex.saySex;
ccc();//this.sex = male
var sex = "male";
var saySex = {
sex:"female",
saySex:function(){
function getSex(){
console.log("this.sex="+this.sex);
}
getSex.call(this);
//与例2只有这个地方的变化
}
}
saySex.saySex(); //this.sex = female call将tis改变成了saySex这个实例对象
var ccc = saySex.saySex;
ccc();//this.sex = male
var name = "ling";
function sayName(){
var a = {
name:"zhang",
sayName:getName
};
function getName(){
console.log(this.name);
}
getName(); //this.name = ling
a.sayName(); //this.name = zhang
getName.call(a);//this.name = zhang
}
sayName();
var name = "ling";
var obj = {
name:"zhang",
sayName:function(){
console.log("this.name="+this.name);
},
callback:function(){
var that = this;
return function(){
var sayName = that.sayName;
that.sayName(); //this.name = zhang
sayName();//this.name = ling
}
}
}
function addEvent(obj,type,callback){
if(obj.addEventListener){
obj.addEventListener(type,callback,false);
}else if(obj.attachEvent){
obj.attachEvent("on"+type,callback);
}else{
var fn = obj["on"+type];
obj["on"+type] = function(){
fn && fn();
callback();
}
}
}
addEvent(document,"click",obj.callback());
var name = "window.name";
var obj = {
name : "obj.name",
getName:function(){
console.log(this.name);
return function(){
console.log(this.name);
}
}
}
obj.getName()(); // obj.name window.name
this的指向,只与调用它的对象有关,如果没有调用它的对象的话,那么就是window,这里是去除没有call、apply、bind改变指向的情况下,且注意,bind不会将函数运行一遍,而call和apply都会将函数运行一遍
题目参考是:
http://www.zhangyunling.com/251.html
也有一些是我在网上看到摘抄的!不懂的话就问我呀
网友评论