再说一下javascript中的this

        QQ好友问了我一个问题,如下:

//例子一
var a = document.write;
a('hello');

//例子二
var b = console.log;
b('hello world');

        他问我,为什么例子一会报错,而例子二却是正常输出的呢?

        其实我一看到这样的写法,就知道这是一个坑,你将别的对象的方法赋值给自己,那如果这个方法里面有this的指向,那这样调用的话,this指向谁了,里面又继续调用了什么方法了,所以肯定会报错的。虽然我没看到源代码的这个方法是怎样写的,但是可以写几个例子就可以验证了,这样:

//第一种写法
var a = document;
a.write('hello');

//第二种写法
var a = document.write.bind(document);
a('hello');

//第三种写法
var a = document.write;
a.call(document,'hello');

        上面三种写法都可以达到想要的效果,运行没有问题。所以很容易知道这是this指向的问题,虽然不知道内部机制如何实现这个方法,但是我们在借用某个对象的方法的时候,记得绑定this的指向,不然容易出错。

        好了,对于上面的例子一中document.write方法会出错,那例子二中console.log为什么不会出错呢?

        我认为就是例子二中console的log方法里面没有用到this的指向,可以举个例子:

var example = {
    test:function(str){
        return str+' what?';
    }
}

var a = console.log.bind(example);
a('123');

        上面这个例子中,我将log方法中的this指向改为指向了一个乱来的example,它仍然可以打印出123,所以可以认为log中没有用到this的指向,所以上面例子二是妥妥的。

原创文章,转载请注明出处!

知识共享许可协议
本文章采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行许可。

发表评论

电子邮件地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据