改变this指向(转)

2018-11-26  本文已影响0人  p712long

我们在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方法的总结

上一篇 下一篇

猜你喜欢

热点阅读