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 相关文章推荐
ExtJS 2.0实用简明教程 之Ext类库简介
Apr 29 Javascript
Javascript笔记一 js以及json基础使用说明
May 22 Javascript
日历查询的算法 如何计算某一天是星期几
Dec 12 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
Feb 24 Javascript
jQuery中:checkbox选择器用法实例
Jan 03 Javascript
javascript变量声明实例分析
Apr 25 Javascript
纯前端JavaScript实现Excel IO案例分享
Aug 26 Javascript
JavaScript 数据类型详解
Mar 13 Javascript
js学习心得_一个简单的动画库封装tween.js
Jul 14 Javascript
Vue 请求传公共参数的操作
Jul 31 Javascript
SpringBoot+Vue 前后端合并部署的配置方法
Dec 30 Vue.js
Vue 修改网站图标的方法
Dec 31 Vue.js
关于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中mysql模块部分功能的简单封装
2011/09/30 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
Codeigniter操作数据库表的优化写法总结
2014/06/12 PHP
PHP中的命名空间相关概念浅析
2015/01/22 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
2016/03/23 PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
2019/10/15 PHP
javascript 定义新对象方法
2010/02/20 Javascript
DIV始终居中的js代码
2014/02/17 Javascript
jquery使用$(element).is()来判断获取的tagName
2014/08/24 Javascript
jquery中EasyUI实现异步树
2015/03/01 Javascript
JS+CSS实现仿触屏手机拨号盘界面及功能模拟完整实例
2015/05/16 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
ES6中参数的默认值语法介绍
2017/05/03 Javascript
Vue.js中extend选项和delimiters选项的比较
2017/07/17 Javascript
JavaScript中数组常见操作技巧
2017/09/01 Javascript
深入理解ES7的async/await的用法
2017/09/09 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
详解Vue.js中.native修饰符
2018/04/24 Javascript
微信小程序登录对接Django后端实现JWT方式验证登录详解
2019/07/29 Javascript
layui实现form表单同时提交数据和文件的代码
2019/10/25 Javascript
Node.js中console.log()输出彩色字体的方法示例
2019/12/01 Javascript
jQuery实现简单QQ聊天框
2020/08/27 jQuery
vant 时间选择器--开始时间和结束时间实例
2020/11/04 Javascript
vue 插槽简介及使用示例
2020/11/19 Vue.js
在nodejs中创建child process的方法
2021/01/26 NodeJs
[51:05]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第一局
2016/03/06 DOTA
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
python实现的防DDoS脚本
2011/02/08 Python
中国京东和泰国中央集团合资的网站:JD CENTRAL
2020/08/22 全球购物
请解释一下webService? 如何用.net实现webService
2014/06/09 面试题
毕业自荐书
2013/12/09 职场文书
服务宗旨标语
2014/07/01 职场文书
工作失误检讨书(3篇)
2014/10/11 职场文书
民主评议政风行风活动心得体会
2014/10/29 职场文书
Windows 11要来了?微软文档揭示Win11太阳谷 / Win10有两个不同版本
2021/11/21 数码科技