关闭

[js] this

96人阅读 评论(0) 收藏 举报
分类:

this
this是一个对象,指调用函数的那个对象

在不同的函数调用情况下,this值会指向不同的对象 this的绑定是调用决定的而非定义决定的
- 方法调用(The Method Invocation Pattern)

// 函数作为对象的一个属性(方法)被调用,this指向该对象
var obj = {
    func: function() {}
}
obj.func() // this == x
  • 函数调用(The Function Invacation Pattern)
// 直接作为函数调用,this指向全局变量(window)
function a() {}
a(); // this == window
  • 构造器调用(The Constructor Invocation Pattern)
// 函数作为构造器,this指向新对象
var NewObj = function() {}
var Obj = new NewObj(); // this == Obj
  • apply调用(The Apply Invocation Pattern)或call调用
function a() {}
a.apply(obj, arguments);
a.apply(obj, arg1, arg2); // this == obj

因为不同的调用方式,this值可能会意外改变

// professiona js for web developers p183
var name = 'Window';
var obj = {
    name: 'Object',
    getN: function() {
        return this.name;
    }
}
var c = null;

obj.getN(); // Object 方法调用
(obj.getN)(); // Object 指向调用对象,obj
(c=obj.getN)(); // Window 赋值
(obj.getN=obj.getN)(); // Window 同上

闭包中的this
闭包中的this指向全局变量(window)

var name = 'window';
var func = function () {
  var name = 'func';
  return function () {
    return this.name;
  }
}
func()(); // window
var f = new func(); // 写法不规范,因为有return所以返回的还是闭包函数,但是在func调用的内部this并不指向window
f(); // window

map
map函数可以传递this到函数中,若不传递默认会是window。在使用lambda表达式时表现不太一样。

var obj = {
  name: 'obj',
  array: [1],
  doSth: function () {
    this.array.map(function (item) {
      console.log(this);
    })
  },
  doSth1: function () {
    this.array.map(function (item) {
      console.log(this);
    },this);
  },
  doSth2: function () {
    this.array.map(p=>console.log(this));
  }
}
obj.doSth(); // window
obj.doSth1(); // obj
obj.doSth2(); // obj

lambda的this是词法作用域的this值,且是在定义时候的词法作用域

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5500次
    • 积分:355
    • 等级:
    • 排名:千里之外
    • 原创:32篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类