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 相关文章推荐
JS代码优化技巧之通俗版(减少js体积)
Dec 23 Javascript
Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍
Dec 13 Javascript
js实现背景图片感应鼠标变化的方法
Feb 28 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
May 26 Javascript
轻松实现jquery选项卡切换效果
Oct 10 Javascript
easyUI combobox实现联动效果
Jan 17 Javascript
浅谈vue的iview列表table render函数设置DOM属性值的方法
Sep 30 Javascript
Vue 源码分析之 Observer实现过程
Mar 29 Javascript
vue计算属性和监听器实例解析
May 10 Javascript
微信小程序实现图片翻转效果的实例代码
Sep 20 Javascript
解决layer.confirm快速点击会重复触发事件的问题
Sep 23 Javascript
JavaScript undefined及null区别实例解析
Jul 21 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 split汉字
2009/06/05 PHP
PHP开启gzip页面压缩实例代码
2010/03/11 PHP
PHP中Trait及其应用详解
2017/02/14 PHP
PHP命名空间(namespace)原理与用法详解
2019/12/11 PHP
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
深入理解jQuery中live与bind方法的区别
2013/12/18 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
javascript强制点击广告的方法
2015/02/06 Javascript
浅析AngularJS中的生命周期和延迟处理
2015/06/18 Javascript
jquery实现的用户注册表单提示操作效果代码分享
2015/08/28 Javascript
使用vue.js实现checkbox的全选和多个的删除功能
2017/02/17 Javascript
JSX在render函数中的应用详解
2019/09/04 Javascript
JS数组splice操作实例分析
2019/10/12 Javascript
解决vue里a标签值解析变量,跳转页面,前面加默认域名端口的问题
2020/07/22 Javascript
js 函数性能比较方法
2020/08/24 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
[00:15]TI9地铁玩家打卡
2019/08/11 DOTA
[50:44]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第二场 2月22日
2021/03/11 DOTA
Python3访问并下载网页内容的方法
2015/07/28 Python
python XlsxWriter模块创建aexcel表格的实例讲解
2018/05/03 Python
python 公共方法汇总解析
2019/09/16 Python
关于Kotlin中SAM转换的那些事
2020/09/15 Python
师范毕业生个人求职信
2013/12/09 职场文书
制药工程专业毕业生推荐信
2013/12/24 职场文书
违反学校规定检讨书
2014/01/18 职场文书
食品安全检查制度
2014/02/03 职场文书
财务总经理岗位职责
2014/02/16 职场文书
餐厅执行经理岗位职责范本
2014/02/26 职场文书
院领导写的就业推荐信
2014/03/09 职场文书
合作经营协议书
2014/04/17 职场文书
青安岗事迹材料
2014/05/14 职场文书
新学期开学演讲稿
2014/05/24 职场文书
团队拓展活动方案
2014/08/28 职场文书
留学推荐信英文范文
2015/03/26 职场文书
使用springMVC所需要的pom配置
2021/09/15 Java/Android
MySQL中一条update语句是如何执行的
2022/03/16 MySQL