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 相关文章推荐
动态表格Table类的实现
Aug 26 Javascript
javascript oop开发滑动(slide)菜单控件
Aug 25 Javascript
在次封装easyui-Dialog插件实现代码
Nov 14 Javascript
使用GruntJS链接与压缩多个JavaScript文件过程详解
Aug 02 Javascript
jquery选择器大全 全面详解jquery选择器
Mar 06 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
May 27 Javascript
jQuery实现高亮显示的方法
Mar 10 Javascript
实例讲解JavaScript的Backbone.js框架中的View视图
May 05 Javascript
Node.js服务器开启Gzip压缩教程
Aug 11 Javascript
如何理解Vue的.sync修饰符的使用
Aug 17 Javascript
Vue面试题及Vue知识点整理
Oct 07 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
Aug 27 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
评分9.0以上的动画电影,剧情除了经典还很燃
2020/03/04 日漫
php自定义函数实现汉字转换utf8编码的方法
2016/09/29 PHP
laravel 自定义常量的两种方案
2019/10/14 PHP
JavaScript效率调优经验
2009/06/04 Javascript
js购物车实现思路及代码(个人感觉不错)
2013/12/23 Javascript
chrome下img加载对height()的影响示例探讨
2014/05/26 Javascript
Nodejs中自定义事件实例
2014/06/20 NodeJs
javascript匀速运动实现方法分析
2016/01/08 Javascript
ES6 Promise对象概念与用法分析
2017/04/01 Javascript
layui分页效果实现代码
2017/05/19 Javascript
JavaScript表单即时验证 验证不成功不能提交
2017/08/31 Javascript
浅析Vue.js中v-bind v-model的使用和区别
2018/12/04 Javascript
js中null与空字符串&quot;&quot;的区别讲解
2019/01/17 Javascript
利用weixin-java-miniapp生成小程序码并直接返回图片文件流的方法
2019/03/29 Javascript
vue自定义表单生成器form-create使用详解
2019/07/19 Javascript
详解vuex数据传输的两种方式及this.$store undefined的解决办法
2019/08/26 Javascript
js实现简单页面全屏
2019/09/17 Javascript
微信小程序实现底部弹出框
2020/11/18 Javascript
[47:04]LGD vs infamous Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
Python使用稀疏矩阵节省内存实例
2014/06/27 Python
Python单元测试框架unittest简明使用实例
2015/04/13 Python
Python通过for循环理解迭代器和生成器实例详解
2019/02/16 Python
Django框架 querySet功能解析
2019/09/04 Python
python range实例用法分享
2020/02/06 Python
详解python tcp编程
2020/08/24 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
2021/01/15 Python
女孩每月服装订阅盒:kidpik
2019/04/17 全球购物
最新自我评价范文
2013/11/16 职场文书
幼儿园优秀教师事迹
2014/02/13 职场文书
大课间活动实施方案
2014/03/06 职场文书
奥巴马的演讲稿
2014/05/15 职场文书
基层党员四风问题自我剖析材料
2014/09/29 职场文书
行政执法队伍作风整顿个人剖析材料
2014/10/11 职场文书
2015年社区环境卫生工作总结
2015/04/21 职场文书
文明医院的标语集锦!
2019/07/24 职场文书
Python趣味挑战之给幼儿园弟弟生成1000道算术题
2021/05/28 Python