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 相关文章推荐
获取当前网页document.url location.href区别总结
May 10 Javascript
jqPlot jquery的页面图表绘制工具
Jul 25 Javascript
javascript一些实用技巧小结
Mar 18 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
Oct 07 Javascript
第一次接触神奇的Bootstrap菜单和导航
Aug 01 Javascript
概述javascript在Google IE中的调试技巧
Nov 24 Javascript
Javascript中return的使用与闭包详解
Jan 11 Javascript
详解从买域名到使用pm2部署node.js项目全过程
Mar 07 Javascript
vue-cli V3.0版本的使用详解
Oct 24 Javascript
Vuex的基本概念、项目搭建以及入坑点
Nov 04 Javascript
Vue 理解之白话 getter/setter详解
Apr 16 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
Nov 26 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
异世界新番又来了,同样是从零开始,男主的年龄降到5岁
2020/04/09 日漫
做个自己站内搜索引擎
2006/10/09 PHP
php 深入理解strtotime函数的使用详解
2013/05/23 PHP
WordPress中设置Post Type自定义文章类型的实例教程
2016/05/10 PHP
thinkPHP订单数字提醒功能的实现方法
2016/12/01 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
用jQuery获取IE9下拉框默认值问题探讨
2013/07/22 Javascript
js实现类似新浪微博首页内容渐显效果的方法
2015/04/10 Javascript
使用DNode实现php和nodejs之间通信的简单实例
2015/07/06 NodeJs
AngularJS 单元测试(一)详解
2016/09/21 Javascript
jQuery插件echarts实现的单折线图效果示例【附demo源码下载】
2017/03/04 Javascript
Bootstrap实现的经典栅格布局效果实例【附demo源码】
2017/03/30 Javascript
hammer.js实现图片手势放大效果
2017/08/29 Javascript
js 倒计时(高效率服务器时间同步)
2017/09/12 Javascript
使用JS模拟锚点跳转的实例
2018/02/01 Javascript
原生js实现针对Dom节点的CRUD操作示例
2019/08/26 Javascript
javascript设计模式 ? 组合模式原理与应用实例分析
2020/04/14 Javascript
Python 字符串操作实现代码(截取/替换/查找/分割)
2013/06/08 Python
python字典多条件排序方法实例
2014/06/30 Python
Python中unittest模块做UT(单元测试)使用实例
2015/06/12 Python
python中matplotlib实现最小二乘法拟合的过程详解
2017/07/11 Python
Python中shapefile转换geojson的示例
2019/01/03 Python
python识别文字(基于tesseract)代码实例
2019/08/24 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
2020/02/07 Python
在python中求分布函数相关的包实例
2020/04/15 Python
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
物业管理公司实习生自我鉴定
2013/09/19 职场文书
老师的检讨书
2014/02/23 职场文书
通用自荐信范文
2014/03/14 职场文书
幼儿园健康教育方案
2014/06/14 职场文书
学校领导班子成员查摆问题及整改措施
2014/10/28 职场文书
安全生产会议制度
2015/08/06 职场文书
详解TS数字分隔符和更严格的类属性检查
2021/05/06 Javascript
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
2021/06/29 Python
MySQL读取JSON转换的方式
2022/03/18 MySQL
Redis 异步机制
2022/05/15 Redis