前一阶段看到大神在网上贴出的测试个人js理解的代码。
在此我在此借用大神的代码,进行自我复述,大神文章参见:http://www.imooc.com/article/1731
代码1:
function foo(){ console.log(this.a);}function doFoo(fn){ fn();}function doFoo2(o){ o.foo();}var obj = { a: 2, foo: foo};var a = "I'm an a";doFoo(obj.foo);doFoo2(obj);
我的理解:
先说doFoo(obj.foo)
传入的参数obj.foo即对象obj的元素foo,内容为foo。
此时传入的foo在方法doFoo中就变成了调用foo()方法。
因为foo()是定义在最外层的,此时的this指向最外层对象window,所以取得的a应该是在最外层定义的 var a = "I'm an a";。
所以第一个方法返回的是I'm an a。
其次说doFoo2(obj)
传入的参数是obj对象.
此时在doFoo2中调用的是obj.foo()。
这时foo()方法中的this重新指向了obj对象,所以this.a取得的是obj对象中的a。
所以第二个方法返回的是2.
大神的分析:
在Javascript中,this指向函数 执行时的当前对象,而非声明环境有。
执行doFoo的时候执行环境就是doFoo函数,执行环境为全局。
执行doFoo2时是在对象内部调用函数,this指针指向该对象。
代码2:
function foo(somthing){ console.log(this.a, somthing);}function bind(fn, obj){ return function(){ return fn.apply(obj, arguments); }}var obj = { a:2}var bar = bind(foo, obj);var b = bar(3);console.log(b);
未完待续
原标题:javascript之观码说理
关键词:JavaScript