听说,你会this?

原创 老姚 随笔 我也来说说系列 6528阅读 2016-08-10 22:48:33 举报

this的指向问题,想必大家都很熟悉了。

js作用域是词法作用域,即书写时决定的变量的可见性,
又由于函数是对象,是引用类型,会产生闭包现象。
而动态作用域是取决于运行时的,this是最接近动态作用域这个概念的。
因此this指向,取决于函数的调用形式。
四种调用形式(函数、方法、call、new),四种指向。

我出几道题,考考大家
1.this丢失问题:
javascript 代码

上面明白的话,下面这个呢:
html 代码

可以认为是作为“函数”调用。换种形式写呢:
javascript 代码

没问题吧?再来个:
javascript 代码

至于这个为啥this指向window,可以认为进行表达式求值时,返回的是个函数,因此作为函数调用,再看
javascript 代码

哈哈,那么下面这个别晕菜:
javascript 代码

2.bind绑定问题
javascript 代码

绑定过了,就不能改了?
javascript 代码

3.ES6的箭头函数
我们知道如下的this指向window
html 代码

但对应的箭头函数呢?
html 代码

4.arguments问题
我想下面的代码应该没人糊涂
javascript 代码

可是我换种写法呢?
javascript 代码

以上总总有感于《你不知道的JavaScript》,
书中关于this的介绍还是很详细的。
还起了几个名字呢?
默认绑定(函数调用),
隐式绑定(方法调用),
显式绑定(call或apply),
new绑定(new构造函数)
还像模像样的给出了调用优先级(上面四种逆序)。。。
此书有英文版(共六本),可以去啃啃。

本文完。

评论 ( 35 )
最新评论
老姚 34F 2016-11-05 08:46:54 35F

先掌握this的四种指向再说。然后把本文看成补充。

lxlxlxlx 2016-11-04 17:18:16 34F

看完彻底懵逼。。对this真的是不明白

陈陈陈大文 2016-09-02 18:27:16 33F

看到有人问a.fn,a.fn,a.fn。
所以就写了点东西,看完之后大家应该知道是什么了。
javascript 代码

CodeMan 2016-08-20 01:39:38 32F

这本书过一段时间就回来啃一遍

hz9527 2016-08-18 15:45:25 31F

看了半天,发现并不是问this而是xx.fn=a.fn;xx.fn();与(xx.fn=a.fn)()的区别。不过为什么赋值并执行时调用对象是window而不是xx?

老姚 29F 2016-08-17 14:34:23 30F

怎么说呢。常见用于单var链模式,以及for语句中。zepto源码中普通语句也用了几下。至于意义这么理解吧:只要是表达式就有返回值,可以大胆想象逗号表达式的发明是为了逐步求解每一部分。

wuxuegangh 20F 2016-08-17 09:15:36 29F

逗号运算有什么意义? 直接写最后一个不就好了吗?

wuxuegangh 2016-08-17 09:05:51 28F

老话说得好 成也this 败也this 高手都死这儿了

zy380196088 2016-08-15 20:38:46 27F

以为了解this了 看了之后还是懵逼了...

小单纯 2016-08-15 13:50:23 26F

刚对this有一点了解,这下又懵逼了。。。

royneedyou 2016-08-13 22:32:32 25F

总结得非常好。其实只要记住一个原则,this指向的是调用该函数的那个对象

老姚 23F 2016-08-13 11:50:19 24F

补充一句,点号和括号也是运算符。因此(a.fn)(),括号作用是保证运算优先级,因此等价于a.fn()这个的

老姚 21F 2016-08-13 11:43:51 23F

恩,可以这么理解。

倾译 2016-08-13 11:00:34 22F

看完之后,一脸懵逼,二脸懵逼,懵逼的n次方

墨白 2016-08-12 18:12:14 21F

我仔细看了又想了(a.fn)和(a.fn,a.fn,a.fn)和(a.fn = a.fn)的差别,我认为是不是因为后面的都存在在运算符所以返回的都是function fn(){}而不是a.fn

yuanoook 11F 2016-08-12 10:10:50 20F

逗号运算符,返回最后一个表达式的值

花小骨 2016-08-12 09:51:16 19F

看完,不敢说会this了

木风622 15F 2016-08-12 08:36:11 18F

我的英文水平。。。。实在是不敢恭维

老姚 16F 2016-08-11 23:13:49 17F

大橙子gg 2016-08-11 17:30:41 16F

老桃儿,你好!