JavaScript调用模式与this关键字绑定的关系


Posted in Javascript onApril 21, 2018

Invocation 调用

调用一个函数将暂停当前函数的执行,传递控制权和参数给新函数。

实参与形参不一致不会导致运行时错误,多的被忽略,少的补为undefined

每个方法都会收到两个附加参数:this和arguments。this的值取决于调用的模式,调用模式:方法,函数,构造器和apply调用模式
this被赋值发生在被调用的时刻。不同的调用模式可以用call方法实现

var myObject = { 
value: 0, 
increment: function (inc) { 
this.value += typeof inc === 'number' ? inc : 1; 
} 
}; 
myObject.double = function(){ 
var helper = function(){ 
console.log(this);// this point to window 
} 
console.log(this);// this point to object myObject 
helper(); 
} 
myObject.double();//myObject Window

1 The Method Invocation Pattern 方法调用模式

方法:函数被保存为对象的属性.当方法被调用时,this被绑定到该对象

公共方法:通过this取得他们所属对象的上下文的方法

myObject.increment(); 
document.writeln(myObject.value); //

底层实现: myObject.increment。call(myObject,0);

2 The Function Invocation Pattern 函数调用模式

当函数并非对象的属性时就被当作函数调用(有点废话。。),this被绑定到全局对象(window)

ECMAScript5中新增strict mode, 在这种模式中,为了尽早的暴露出问题,方便调试。this被绑定为undefined

var add = function (a,b) { return a + b;}; 
var sum = add(3,4);// sum的值为7

底层实现:add.call(window,3,4)

strict mode:add.call(undefined,3,4)

方法调用模式和函数调用模式的区别

function hello(thing) { 
console.log(this + " says hello " + thing); 
} 
person = { name: "Brendan Eich" } 
person.hello = hello; 
person.hello("world") // [object Object] says hello world 等价于 person。hello。call(person,“world”) 
hello("world") // "[object DOMWindow]world" 等价于 hello。call(window,“world”)

3 The Constructor Invocation Pattern

JavaScript是基于原型继承的语言,同时提供了一套基于类的语言的对象构建语法。

this指向new返回的对象

var Quo = function (string) { 
this.status = string; 
}; 
Quo.prototype.get_status = function ( ) { 
return this.status; 
}; 
var myQuo = new Quo("this is new quo"); //new容易漏写,有更优替换 
myQuo.get_status( );// this is new quo

4 The Apply Invocation Pattern

apply和call是javascript的内置参数,都是立刻将this绑定到函数,前者参数是数组,后者要一个个的传递apply也是由call底层实现的

apply(this,arguments[]); 
call(this,arg1,arg2...); 
var person = { 
name: "James Smith", 
hello: function(thing,thing2) { 
console.log(this.name + " says hello " + thing + thing2); 
} 
} 
person.hello.call({ name: "Jim Smith" },"world","!"); // output: "Jim Smith says hello world!" 
var args = ["world","!"]; 
person.hello.apply({ name: "Jim Smith" },args); // output: "Jim Smith says hello world!"

相对的,bind函数将绑定this到函数和调用函数分离开来,使得函数可以在一个特定的上下文中调用,尤其是事件bind的apply实现

Function.prototype.bind = function(ctx){ 
var fn = this; //fn是绑定的function 
return function(){ 
fn.apply(ctx, arguments); 
}; 
}; 
bind用于事件中 
function MyObject(element) { 
this.elm = element; 
element.addEventListener('click', this.onClick.bind(this), false); 
}; 
//this对象指向的是MyObject的实例 
MyObject.prototype.onClick = function(e) { 
var t=this; //do something with [t]... 
};

总结

以上所述是小编给大家介绍的JavaScript调用模式与this关键字绑定的关系 ,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
ASP中进行HTML数据及JS数据编码函数
Nov 11 Javascript
javascript 学习笔记(八)javascript对象
Apr 12 Javascript
利用JS解决ie6不支持max-width,max-height问题的方法
Jan 02 Javascript
javascript常见用法总结
May 22 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
Feb 26 Javascript
浅谈JS运算符&&和|| 及其优先级
Aug 10 Javascript
Bootstrap基本布局实现方法详解
Nov 25 Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
Dec 27 Javascript
基于JavaScript实现滑动门效果
Mar 16 Javascript
详解Node使用Puppeteer完成一次复杂的爬虫
Apr 18 Javascript
layer.msg()去掉默认时间,实现手动关闭的方法
Sep 12 Javascript
深入浅析React中diff算法
May 19 Javascript
关于jquery layui弹出层的使用方法
Apr 21 #jQuery
jQuery中的for循环var与let的区别
Apr 21 #jQuery
AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例
Apr 21 #Javascript
JS实现字符串去重及数组去重的方法示例
Apr 21 #Javascript
AngularJs用户输入动态模板XSS攻击示例详解
Apr 21 #Javascript
vue源码解析之事件机制原理
Apr 21 #Javascript
JavaScript获取用户所在城市及地理位置
Apr 21 #Javascript
You might like
PHP安装全攻略:APACHE
2006/10/09 PHP
php图片验证码代码
2008/03/27 PHP
定义php常量的详解
2013/06/09 PHP
php实现的mongodb操作类
2015/05/28 PHP
php如何修改SESSION的生存存储时间的实例代码
2017/07/05 PHP
php之可变函数的实例详解
2017/09/13 PHP
面向对象的编程思想在javascript中的运用上部
2009/11/20 Javascript
document.getElementById获取控件对象为空的解决方法
2013/11/20 Javascript
js确认删除对话框适用于a标签及submit
2014/07/10 Javascript
Javascript显示和隐藏ul列表的方法
2015/07/15 Javascript
如何防止JavaScript自动插入分号
2015/11/05 Javascript
JavaScript面试开发常用的知识点总结
2016/08/08 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
2017/03/14 Javascript
JS判断两个对象内容是否相等的方法示例
2017/04/10 Javascript
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
2017/10/23 Javascript
Vue组件中的data必须是一个function的原因浅析
2018/09/03 Javascript
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
JavaScript链式调用原理与实现方法详解
2020/05/16 Javascript
python标准算法实现数组全排列的方法
2015/03/17 Python
开始着手第一个Django项目
2015/07/15 Python
django数据库migrate失败的解决方法解析
2018/02/08 Python
python如何将图片转换为字符图片
2020/08/19 Python
对python pandas 画移动平均线的方法详解
2018/11/28 Python
Python实现图片转字符画的代码实例
2019/02/22 Python
Python 3.8 新功能大揭秘【新手必学】
2020/02/05 Python
毕业生的自我评价
2013/12/30 职场文书
犯错检讨书
2014/02/21 职场文书
《李广射虎》教学反思
2014/04/27 职场文书
党员干部廉洁承诺书
2014/05/28 职场文书
2014新生大学四年计划书
2014/09/21 职场文书
银行资信证明
2015/06/17 职场文书
推广普通话的宣传语
2015/07/13 职场文书
生日宴会祝酒词
2015/08/10 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书
详解java如何集成swagger组件
2021/06/21 Java/Android
Python实现Matplotlib,Seaborn动态数据图
2022/05/06 Python