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 继承实现例子
Aug 12 Javascript
js 获取元素下面所有li的两种方法
Apr 14 Javascript
浅析AngularJS中的指令
Mar 20 Javascript
JavaScript实现大图轮播效果
Jan 11 Javascript
vue2.0构建单页应用最佳实战
Apr 01 Javascript
Vue项目全局配置页面缓存之按需读取缓存的实现详解
Aug 01 Javascript
详解基于vue-cli3.0如何构建功能完善的前端架子
Oct 09 Javascript
vue+Element-ui实现分页效果实例代码详解
Dec 10 Javascript
vue 插件的方法代码详解
Jun 06 Javascript
javascript实现切割轮播效果
Nov 28 Javascript
vue 封装 Adminlte3组件的实现
Mar 18 Javascript
antd table按表格里的日期去排序操作
Nov 17 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
长波有什么东西
2021/03/01 无线电
php,不用COM,生成excel文件
2006/10/09 PHP
深思 PHP 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
php判断终端是手机还是电脑访问网站的思路及代码
2013/04/24 PHP
PHP的PSR规范中文版
2013/09/28 PHP
php使用NumberFormatter格式化货币的方法
2015/03/21 PHP
利用Dojo和JSON建立无限级AJAX动态加载的功能模块树
2007/03/24 Javascript
javascript针对DOM的应用实例(一)
2012/04/15 Javascript
javascript学习笔记(九) js对象 设计模式
2012/06/19 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
Javascript代码实现仿实例化类
2015/04/03 Javascript
jquery带动画效果幻灯片特效代码
2015/08/27 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
vue中计算属性(computed)、methods和watched之间的区别
2017/07/27 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
2017/09/20 jQuery
centos 上快速搭建ghost博客方法分享
2018/05/23 Javascript
vue富文本编辑器组件vue-quill-edit使用教程
2018/09/21 Javascript
了解JavaScript中的选择器
2019/05/24 Javascript
python计算圆周率pi的方法
2015/07/11 Python
Python实现时钟显示效果思路详解
2018/04/11 Python
使用OpenCV对车道进行实时检测的实现示例代码
2020/06/19 Python
来自全球大都市的高级街头服饰:Pegador
2018/01/03 全球购物
中东地区为妈妈们提供一切的头号购物目的地:Sprii
2018/05/06 全球购物
官方授权图形T恤和服装:Fifth Sun
2019/06/12 全球购物
Shell脚本如何向终端输出信息
2014/04/25 面试题
四年大学生活的自我评价范文
2014/02/07 职场文书
英文求职信范文
2014/05/23 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
办理信用卡收入证明范例
2014/09/13 职场文书
2014年宣传部工作总结
2014/11/12 职场文书
党支部2014年度工作总结
2014/12/04 职场文书
三傻大闹宝莱坞观后感
2015/06/03 职场文书
黑暗中的舞者观后感
2015/06/18 职场文书
2015年学校政教工作总结
2015/07/20 职场文书
学校团代会开幕词
2016/03/04 职场文书
深入浅析React中diff算法
2021/05/19 Javascript