[JavaScript学习笔记] this

module1.init($div)              // 语法糖
module1.init.call(module1,$div) // 等价

详解

this 永远在函数调用时确定,只是由于语法糖的存在,我们在实际使用时会受到使用场景(浏览器/库)内部this指向的不同的影响。

  1. 由于语法糖的存在,我们在平常调用函数时很少使用.call(this,argument)的形式
  2. 所以如果你自己指定this,就call

例子

let module1 = {
  elment:null,
  init: ($div)=>{
    this.element = $div
    this.bindEvents()
  },
  bindEvents:function(){
    let $div = this.element
    $div.on('click', fucntion(e){
      console.log('div is clicked')
    })
    $div.on('click', 'button', this.onClickButton)
    // 浏览器
    // when user click button
    // fn.call('button', {target:'button',currentTarget:'button'})
    // 所以这里只跟调用时有关
    $div.on('change', 'input', function(e){
      console.log(xxx)
    })
  },
}

总结

一般情况下,

  1. 当函数作为对象方法调用时,this指向调用该方法最靠近的对象成员,因此:
  • 当函数被赋予另一个变量时,函数内部的this的指向会改变,其原因是调用他的对象有变更
  • 可以理解为对象即执行该函数的环境,在顶级作用域下执行函数,this指向全局变量(浏览器中为window)
var a = {
  b: {
    m: function() {
      console.log(this.p);
    },
    p: 'Hello'
  }
};

var hello = a.b.m;
hello() // undefined

var hello = a.b
hello()  // Hello
  1. 构造函数中的this默认绑定为被创建的新对象
    原理:
  1. 创建一个空对象,作为将要返回的对象实例
  2. 将这个空对象的原型指向prototype属性
  3. 将这个空对象的值赋给函数内部的this关键字
  4. 开始执行构造函数内部代码

参考前面的方法,总结为

var a = function(){
  this.balaba = 123;
}
var b 
b = {}
Object.setPrototypeOf(b, a)
a.call(b)
  1. 当函数被当做事件处理函数时,this指向触发事件的函数

  2. 内联事件处理函数的this指向监听器所在的DOM元素

  3. 当函数作为嵌套函数调用时, this指向全局对象(非严格模式下)或者undefined(严格模式)而不是其外包函数的上下文

var o = {
  f1: function () {
    console.log(this);
    var f2 = function () {
      console.log(this);
    }();
  }
}
o.f1()  
// Object 
// Window
    
// 上面等价于下面
var temp = function () {
  console.log(this);
};

var o = {
  f1: function () {
    console.log(this);
    var f2 = temp();
  }
}

// 解决办法
var o = {
  f1: function() {
    console.log(this);
    var that = this;
    var f2 = function() {
      console.log(that);
    }();
  }
}

o.f1() 
// Object
// Object

怎么看this

  1. console.log()
  2. 看浏览器/jQuery/DOM 源代码
  3. 看API 文档

bind()

bind() 会返回一个新的函数,该函数有指定的this,且不被call() / apply()

bind的使用例子

根据前面总结的第3条和第5,如果需要在一个函数中的事件监听设置this指向外包函数的this,可以用bind绑定this的指向,否则,监听事件触发时this会指向触发事件的元素。

var box = document.getElementById('box');
box.x = 'box'
function outFunc() {
  this.x = 'outFunc';//给全局对象window.x赋值(相当于赋值全局变量)
  box.addEventListener('click', func.bind(this), false); // bind(this) 的this 指向outFunc() 中的this,又等于指向window
}
function func() {
  console.log(this.x); //输出outFunc 使用bind设置this的值
}

参考:
JS中的this简单描述
addEventListener中事件函数的this指向
MDN - JavaScript - this

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,054评论 1 10
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,717评论 2 17
  • 转载请著名出处 GitHub-TYRMars 文章Github地址 JavaScript基础知识剖析 01 01-...
    TYRMars阅读 551评论 0 7
  • 原文链接 Haskell和scala都支持函数的柯里化,JavaScript函数的柯里化还与JavaScript的...
    dreamapple阅读 2,511评论 0 24
  • 1. this之谜 在JavaScript中,this是当前执行函数的上下文。因为JavaScript有4种不同的...
    百里少龙阅读 986评论 0 3