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

 更新时间:2016年05月28日 16:37:18   投稿:jingxian  
下面小编就为大家带来一篇深入理解js函数的作用域与this指向。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

函数的作用域与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指向就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 分享12个Webpack中常用的Loader(小结)

    分享12个Webpack中常用的Loader(小结)

    这篇文章主要介绍了分享12个Webpack中常用的Loader(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Javascript中Cookie的获取和保存应用案例

    Javascript中Cookie的获取和保存应用案例

    这篇文章主要给大家介绍了关于Javascript中Cookie的获取和保存应用的相关资料,Cookie是直接存储在浏览器中的一小串数据,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • 最佳的addEvent事件绑定是怎样诞生的

    最佳的addEvent事件绑定是怎样诞生的

    IE的 JScript 存在内存泄露的bug 想必大家都清楚或者有耳闻了。这是由于IE的内存回收管理器的一个设计错误导致的
    2011-10-10
  • JavaScript实现256色转灰度图

    JavaScript实现256色转灰度图

    本文主要介绍了JavaScript实现256色转灰度图的示例代码,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • 如何使用Javascript获取距今n天前的日期

    如何使用Javascript获取距今n天前的日期

    本篇文章是对使用Javascript获取距今n天前日期的实现代码进行了详细的分析介绍,需要的朋友参考下
    2013-07-07
  • javascript简单链式调用案例分析

    javascript简单链式调用案例分析

    这篇文章主要介绍了javascript简单链式调用,结合具体实例形式模拟jQuery分析了链式调用的原理与具体实现技巧,需要的朋友可以参考下
    2017-05-05
  • 详解javascript实现自定义事件

    详解javascript实现自定义事件

    这篇文章主要为大家介绍了javascript实现自定义事件的方法,自定义事件,顾名思义,就是自己定义事件类型,自己定义事件处理函数,javascript如何实现自定义事件,需要了解的朋友可以参考下
    2016-01-01
  • 简单的JS时钟实例讲解

    简单的JS时钟实例讲解

    这篇文章主要为大家分享了一个简单的JS时钟实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • javascript温习的一些笔记 基础常用知识小结

    javascript温习的一些笔记 基础常用知识小结

    在电脑上找到多年前的javascript的一些小笔记,因为要将笔记本上面的文件整理一下, 不用的删除掉, 所以将此篇笔记再发布一下,存档到自己的博客吧, 电脑上的文件就删除了
    2011-06-06
  • 详解JavaScript中Arguments对象用途

    详解JavaScript中Arguments对象用途

    本文主要介绍了详解JavaScript中Arguments对象用途,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08

最新评论