一道题

写出下面代码的运行的结果

  1. var length=10;
  2. function fn(){
  3. console.log(this.length);
  4. }
  5. var obj = {
  6. length:5,
  7. method: function (fn) {
  8. fn();
  9. arguments[0]();
  10. }
  11. };
  12. obj.method(fn);
  13. obj.method(fn, 123);

解答:
函数有如下的集中调用方式

  1. 普通的函数调用methods()
  2. 作为对象的属性进行调用obj.methods()
  3. 使用call,apply进行调用metthod.call(obj)

作为普通函数调用时this的指向

  1. function func(){
  2. console.log(this)
  3. }
  4. func()
  1. function func(){
  2. console.log(this)
  3. }
  4. func.call(undefined)

规则:函数传入的参数是null或者是undefined,那么this的默认指向就是全局对象window。

所以上面的打印结果是window
作为对象的方法调用

  1. var obj={
  2. foo:function(){
  3. console.log(this)
  4. }
  5. }
  6. obj.foo()

可以转换为

  1. obj.foo.call(obj)

此时this指向obj。

[]语法

  1. function fn(){
  2. console.log(this)
  3. }
  4. var arr=[fn,fn2]
  5. arr[0]()

转换为

  1. arr[0].call(arr)