天天看点

Javascript编程“陷阱”总结

首先看一段代码:

这样就出现问题了,只有obj.printid()返回了我们想要的结果,第二种调用只是个赋值,但this却指向global,第三种调用,this指向object,但是显然不是我们定义的obj,因此它获取不到id属性。原因就在于,在javascript中,this关键字的指向是在函数调用的时候定义的。callback()在调用的时候,属于全局顶层的函数,已经不是我们定义的obj中的一个函数,所以this指向global,至于settimeout的回调函数调用方式之所以指向一个object,这应该和settimeout这个api的实现方式有关

那我们有没有办法用callback和settimeout方式显示出正常结果呢?你可以这样写:

第一个,最简单的例子:

第二个,加个异步函数,也很简单:

第三个,我们制作一个方法数组:

第一个,如我们所想,输出0,1,2,3,4;可是第二个第三个都是5,5,5,5,5.

原因分析:我们在for循环中定义的变量i,在for循环结束后还没有走出它的作用域,也就是说for循环之后,i依然可以访问,值等于最后一次循环后的值,就是5了。第二段代码中,settimeout的回调函数执行时,for循环已经完成,此时i就是5。同理,第三段代码,在data[i]()执行时,i已经是5了。当然,我们有办法让它显示正确结果,但要增加一个变量,像这样:

继续阅读