深入理解js函数的作用域与this指向


Posted in Javascript onMay 28, 2016

函数的作用域与this指向是js中很重要的一部分,理清这点东西需要个逻辑,看看我的逻辑怎么样...

下面是个提纲,可以直接挑你感兴趣的条目阅读。

• 函数的定义方式:直接定义(window下,内部定义),对象的方法,对象原型的方法;

• 函数的调用方式:直接调用,call/apply,with

• 对于直接定义的函数和对象的方法,作用域默认状态下是它的定义处的作用域链。

• 对于直接定义的函数,this指向window。

• 对于对象的方法,this指向实例化对象(对应于实例化对象默认返回this的情况)。

• 用call/apply改变方法的this指向

• 在函数或方法的定义时可以通过with改变其作用域链。

下面分开来具体说说:

函数的定义,如提纲中提到的可以分为两种:直接定义(window下,内部定义),对象的方法(或对象原型的方法)。从下面的示例代码中可以看到函数fn1与fn2以及对象的方法doFunction在函数使用name时name的值来自相应的域。

 

var name = 'window下的name<br/>';
var resultCon;
function fn1() {
  resultCon.innerHTML += name;
}

function MyObj() {
  var name = 'MyObj下的name<br/>';
  this.doFunction = function() {
    resultCon.innerHTML += name;

在使用name的值时将“name”用“this.name”来代替会出现什么情况呢,看下例:

var name = 'window下的name<br/>';
var resultCon;
function fn1() {
  resultCon.innerHTML += this.name;
}

function MyObj() {
  var name = 'MyObj下的name<br/>';
  this.doFunction = function() {
    resultCon.innerHTML += this.name;

从结果来看可以验证提纲中的第4和5条,也可以看到this和作用域是两套分离的链,遵循个自的变量查询逻辑,具体的查询逻辑在下面的性能分析中会提到,如果是新手建议先看一下“js的作用域链”方面的基础知识。

 关于函数的调用方法,我用下面的方示例说明提纲中的第2、6条:

var name = 'window下的name<br/>';
var resultCon;
function fn1() {
  resultCon.innerHTML += this.name;
}

function MyObj() {
  var name = 'MyObj下的name<br/>';
  this.doFunction = function() {
    resultCon.innerHTML += this.name;

调用时call和apply的使用是为了改变被调用函数的this指向。with的使用是为了改变被调用函数中变量的查询域。我们把上例中的call和name前的this去掉再加上with来演示with的作用。

var name = 'window下的name<br/>';
var resultCon;
function fn1(myScope) {
  with (myScope) {
    resultCon.innerHTML += name;
  }
}

function MyObj(myScope) {
  var name = 'MyObj下的name<br/>';

看到with的使用并不方便,需要在被调用函数中添加with,有人可能想能不能向下面那样调用来整体改变变量作用域而不去改变被调用函数呢?

with (myScope) {
  fn1();
  fn2();
  var obj = new MyObj();
  obj.doFunction();
}

很遗憾,不可以!所以在一些成熟的框架中随处可见call和apply的使用,却很少用到with,在用JSHint检测js语法的时候with处都标了小红点,在一些js编码指导中也建议尽量少用with,因为with改变了变量的默认查询链,所以会给后期的维护人员一些困惑,还有性能方面的一些考虑,请慎用with。

以上这篇深入理解js函数的作用域与this指向就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 类定义的4种方法
Sep 12 Javascript
js change,propertychange,input事件小议
Dec 20 Javascript
onkeypress字符按键兼容所有浏览器使用介绍
Apr 24 Javascript
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
Oct 11 Javascript
详解JS 比较两个Json对象的值是否相等的实例
Nov 20 Javascript
javascript中的原型链深入理解
Feb 24 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
Sep 12 Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
Jan 13 Javascript
JavaScript SHA512&amp;SHA256加密算法详解
Aug 11 Javascript
angular2使用简单介绍
Mar 01 Javascript
使用Node.js实现RESTful API的示例
Aug 01 Javascript
解决layui的input独占一行的问题
Sep 10 Javascript
js和C# 时间日期格式转换的简单实例
May 28 #Javascript
JS函数arguments数组获得实际传参数个数的实现方法
May 28 #Javascript
深入理解JS函数的参数(arguments)的使用
May 28 #Javascript
深入理解js中this的用法
May 28 #Javascript
关于function类中定义变量this的简单说明
May 28 #Javascript
Highcharts 多个Y轴动态刷新数据的实现代码
May 28 #Javascript
动态更新highcharts数据的实现方法
May 28 #Javascript
You might like
thinkphp命名空间用法实例详解
2015/12/30 PHP
php实现生成code128条形码的方法详解
2017/07/19 PHP
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
JS input文本框禁用右键和复制粘贴功能的代码
2010/04/15 Javascript
围观tangram js库
2010/12/28 Javascript
新发现一个骗链接的方法(js读取cookies)
2012/01/11 Javascript
分享精心挑选的12款优秀jQuery Ajax分页插件和教程
2012/08/09 Javascript
js简单实现竖向tab选项卡的方法
2015/05/04 Javascript
jQuery实用技巧必备(下)
2015/11/03 Javascript
每天一篇javascript学习小结(Function对象)
2015/11/16 Javascript
jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
2015/12/12 Javascript
从零开始学习Node.js系列教程四:多页面实现数学运算的client端和server端示例
2017/04/13 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
JavaScript数组去重算法实例小结
2018/05/07 Javascript
Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条
2019/06/24 Javascript
vue-路由精讲 二级路由和三级路由的作用
2020/08/06 Javascript
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
python使用三角迭代计算圆周率PI的方法
2015/03/20 Python
Python计算两个矩形重合面积代码实例
2019/09/16 Python
使用Python完成15位18位身份证的互转功能
2019/11/06 Python
Python中if有多个条件处理方法
2020/02/26 Python
python实现视频压缩功能
2020/12/18 Python
实例教程 一款纯css3实现的数字统计游戏
2014/11/10 HTML / CSS
Crabtree & Evelyn英国官网:瑰珀翠护手霜、香水、沐浴和身体护理
2018/04/26 全球购物
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
简历中求职的个人自我评价
2013/12/03 职场文书
超市重阳节活动方案
2014/02/10 职场文书
新年晚会主持词
2014/03/24 职场文书
淘宝客服工作职责
2014/07/11 职场文书
“六查”、“三学”、“三干”查摆问题整改措施
2014/09/27 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
个人欠款协议书范本2014
2014/11/02 职场文书
群众路线四风对照检查材料
2014/11/04 职场文书
2014年服务行业工作总结
2014/11/18 职场文书
数学考试作弊检讨书300字
2015/02/16 职场文书