javaScript中的this示例学习详解及工作原理


Posted in Javascript onJanuary 13, 2014

this的工作原理

如果一个函数被作为一个对象的方法调用,那么this将被指派为这个对象。

var parent = {
    method: function () {
        console.log(this);
    }
};parent.method();
// <- parent

注意这种行为非常“脆弱”,如果你获取一个方法的引用并且调用,那么this的值不会是parent了,而是window全局对象。这让大多数开发者迷惑。

ThisClownCar();
// <- Window
 

改动this

.call、 .apply 和.bind 方法用来操作调用函数的方式,帮我们定义this的值和传递给函数的参数值。

Function.prototype.call 可以有任意数量的参数,第一个参数被分配给this,剩下的被传递给调用函数。

Array.prototype.slice.call([1, 2, 3], 1, 2)
// <- [2]Function.prototype.apply 的行为和.call类似,但它传递给函数的参数是一个数组,而不是任意参数。
String.prototype.split.apply('13.12.02', ['.'])
// <- ['13', '12', '02']
 

Function.prototype.bind 创建一个特殊的函数,该函数将永远使用传递给.bind的参数作为this的值,以及能够分配部分参数,创建原函数的珂里化(curride)版本。

 

var arr = [1, 2];
var add = Array.prototype.push.bind(arr, 3);// effectively the same as arr.push(3)
add();
// effectively the same as arr.push(3, 4)
add(4);
console.log(arr);
// <- [1, 2, 3, 3, 4]

作用域链中的this

在下面的例子,this将无法在作用域链中保持不变。这是规则的缺陷,并且常常会给业余开发者带来困惑。

function scoping () {
  console.log(this);  return function () {
    console.log(this);
  };
}
scoping()();
// <- Window
// <- Window

有一个常见的方法,创建一个局部变量保持对this的引用,并且在子作用域中不能有同命变量。子作用域中的同名变量将覆盖父作用域中对this的引用。http://www.cnblogs.com/sosoft/

function retaining () {
  var self = this;  return function () {
    console.log(self);
  };
}
retaining()();
// <- Window
 

除非你真的想同时使用父作用域的this,以及当前this值,由于某些莫名其妙的原因,我更喜欢是使用的方法.bind函数。这可以用来将父作用域的this指定给子作用域。

 

function bound () {
  return function () {
    console.log(this);
  }.bind(this);
}bound()();
// <- Window
Javascript 相关文章推荐
用js脚本控制asp.net下treeview的NodeCheck的实现代码
Mar 02 Javascript
jquery 查找iframe父级页面元素的实现代码
Aug 28 Javascript
原生js和jquery中有关透明度设置的相关问题
Jan 08 Javascript
JS实现网页标题栏显示当前时间和日期的完整代码
Nov 02 Javascript
跟我学习javascript的call(),apply(),bind()与回调
Nov 16 Javascript
JavaScript弹窗基础篇
Apr 27 Javascript
js定义类的几种方法(推荐)
Jun 08 Javascript
利用yarn实现一个webpack+react种子
Oct 25 Javascript
Javascript之面向对象--接口
Dec 02 Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
May 24 Javascript
基于JS实现移动端左滑删除功能
Jul 28 Javascript
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
Sep 25 Javascript
JS 日期比较大小的简单实例
Jan 13 #Javascript
JS之Date对象和获取系统当前时间详解
Jan 13 #Javascript
JS OffsetParent属性深入解析
Jan 13 #Javascript
JavaScript网页定位详解
Jan 13 #Javascript
js菜单点击显示或隐藏效果的简单实例
Jan 13 #Javascript
ie8本地图片上传预览示例代码
Jan 12 #Javascript
js 立即调用的函数表达式如何写
Jan 12 #Javascript
You might like
最小化数据传输――在客户端存储数据
2006/10/09 PHP
基于PHP文件操作的详解
2013/06/05 PHP
php中类和对象:静态属性、静态方法
2017/04/09 PHP
Laravel中的Blade模板引擎示例详解
2017/10/10 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
PHP实现的XXTEA加密解密算法示例
2018/08/28 PHP
Laravel 模型关联基础教程详解
2019/09/17 PHP
Laravel基础_关于view共享数据的示例讲解
2019/10/14 PHP
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
javascript 年月日联动实现核心代码
2009/12/21 Javascript
jquery 利用show和hidden实现级联菜单示例代码
2013/08/09 Javascript
jquery仿搜索自动联想功能代码
2014/05/23 Javascript
js实现二代身份证号码验证详解
2014/11/20 Javascript
jQuery插件学习教程之SlidesJs轮播+Validation验证
2016/07/12 Javascript
vue.js入门(3)——详解组件通信
2016/12/02 Javascript
基于IView中on-change属性的使用详解
2018/03/15 Javascript
原生JS进行前后端同构
2018/04/22 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
webuploader分片上传的实现代码(前后端分离)
2018/09/10 Javascript
微信小程序基于Taro的分享图片功能实践详解
2019/07/12 Javascript
深入探索VueJS Scoped CSS 实现原理
2019/09/23 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
2019/09/23 Javascript
让mocha支持ES6模块的方法实现
2020/01/14 Javascript
[01:03:38]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS CIS
2014/05/22 DOTA
[02:10]2018DOTA2亚洲邀请赛赛前采访-Liquid
2018/04/03 DOTA
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[01:39:42]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python中使用第三方库xlutils来追加写入Excel文件示例
2015/04/05 Python
python re模块findall()函数实例解析
2018/01/19 Python
python图形工具turtle绘制国际象棋棋盘
2019/05/23 Python
Python环境搭建过程从安装到Hello World
2021/02/05 Python
《山谷中的谜底》教学反思
2014/04/26 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
民警忠诚教育心得体会
2016/01/23 职场文书
如何拟写通知正文?
2019/04/02 职场文书
SpringBoot生成License的实现示例
2021/06/16 Java/Android