我们在js中可以使用document.write()方法向网页中输入文本内容。如
document.write("test"); 网页中就会被加入’test’文本。
但是如果我们像下面这么写呢?
1 var myWrite = document.write;
2 myWrite("test"); //报错
上面的代码首先是我将document.write方法赋值给myWrite方法。然后使用myWrite()方法向网页中输入文本内容。但是这里会报错,为什么呢?
原因就在这个write方法的this指针的域被改变啦!
document.write()方法的this是指向document的,所以可以向网页中输入文本内容。
但是我们将document.write方法赋值给myWrite对象,然后在调用myWrite()方法。调用myWrite()方法的对象域是全局变量window,相当于window.myWrite()。此时this指向window,而不指向document.所以会报错。
遇到上面的this指向被改变了,该怎么办呢?
这时候就要设置this的指针指向了,JavaScript有三个方法bind()、call()、apply()。
1.使用bind方法
a.bind(b); 就是将a()方法的this指针的作用域绑定到b对象的作用域上,也就是现在a的this指针的作用域就是b
如是上面的代码就可以改成:
1 var myWrite = document.write;
2 myWrite.bind(document)("test"); //此时的this指针指向了bind()的document,网页中正常输出test。
2.使用call方法
call(a, b);: a是当前方法需要指向的域,后面的b是当前方法的参数,可以传多个参数,多个参数直接用逗号隔开即可,如 :call(a, b, c, d);, b, c, d都是方法的参数(arguments)。
var myWrite = document.write;
myWrite.call(document, "test"); //此时的this指针指向了bind()的document,网页中正常输出test。
1
2
3.使用apply方法
apply(a, b); :a是当前方法需要指向的域,后面的b是当前方法的参数,可以传多个参数,多个参数需要使用数组来传入。如apply(a, [b, c, d]);,b、c、d为参数(数组)。
1 var myWrite = document.write;
2 myWrite.apply(document, "test"); //此时的this指针指向了bind()的document,网页中正常输出test。
体请看: JavaScript中call,apply,bind方法的总结
网友评论