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 相关文章推荐
javascript学习笔记(六) Date 日期类型
Jun 19 Javascript
js原型继承的两种方法对比介绍
Mar 30 Javascript
jquery实现的一个简单进度条效果实例
May 12 Javascript
javascript数组输出的两种方式
Jan 13 Javascript
js实现类似jquery里animate动画效果的方法
Apr 10 Javascript
理解javascript模块化
Mar 28 Javascript
react native带索引的城市列表组件的实例代码
Aug 08 Javascript
详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
Aug 09 jQuery
基于JavaScript实现抽奖系统
Jan 16 Javascript
javascript trie前缀树的示例
Jan 29 Javascript
JS实现求字符串中出现最多次数的字符和次数示例
Jul 05 Javascript
npm全局环境变量配置详解
Dec 15 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分页显示制作详细讲解
2008/11/19 PHP
php中static静态变量的使用方法详解
2010/06/04 PHP
php计算当前程序执行时间示例
2014/04/24 PHP
php中http与https跨域共享session的解决方法
2014/12/20 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
2015/11/05 PHP
有关js的变量作用域和this指针的讨论
2010/12/16 Javascript
js实现拉伸拖动iframe的具体代码
2013/08/03 Javascript
JavaScript中神奇的call()方法
2015/03/12 Javascript
点评js异步加载的4种方式
2015/12/22 Javascript
Bootstrap树形组件jqTree的简单封装
2016/01/25 Javascript
javascript中Date对象的使用总结
2016/11/21 Javascript
jquery 正整数数字校验正则表达式
2017/01/10 Javascript
jQuery插件JWPlayer视频播放器用法实例分析
2017/01/11 Javascript
Angularjs的启动过程分析
2017/07/18 Javascript
详解基于vue-cli配置移动端自适应
2018/01/13 Javascript
Javascript 实现 Excel 导入生成图表功能
2018/10/22 Javascript
JS中的模糊查询功能
2019/12/08 Javascript
vue和H5 draggable实现拖拽并替换效果
2020/07/29 Javascript
javaScript代码飘红报错看不懂?读完这篇文章再试试
2020/08/19 Javascript
[01:44]剑指西雅图 展望TI之CIS战队专访
2014/06/25 DOTA
Python中if __name__ == '__main__'作用解析
2015/06/29 Python
使用python实现省市三级菜单效果
2016/01/20 Python
Python Tkinter模块实现时钟功能应用示例
2018/07/23 Python
python实现事件驱动
2018/11/21 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
2018/12/14 Python
Python调用C语言的实现
2019/07/26 Python
python集合常见运算案例解析
2019/10/17 Python
Python with语句和过程抽取思想
2019/12/23 Python
德国电子产品购物网站:TechInTheBasket德国
2018/12/07 全球购物
企业统计员岗位职责
2013/12/13 职场文书
教师个人自我评价范文
2014/04/13 职场文书
经理任命书模板
2014/06/06 职场文书
销售团队获奖感言
2014/08/14 职场文书
高一课前三分钟演讲稿
2014/09/13 职场文书
2015年施工员工作总结范文
2015/04/20 职场文书
遗嘱格式范本
2015/08/07 职场文书