美文网首页
立即执行函数与作用域问题1

立即执行函数与作用域问题1

作者: kenny_bai | 来源:发表于2018-10-25 14:17 被阅读0次

题目如下:

var x = 10;

function fn(){

    console.log(x);

}

function show(f){    

    var x = 20;

    (function () {

        f();

    })();

}

show(fn);

从题目可以看出,这里在全局和函数内部声明了两个同名的x变量。函数show内部还有一个立即执行函数。其实这些都是烟雾弹,这道题其实是主要想考查,我们对于作用域链的理解,下面我们来分析下:

1.首先在全局范围内,声明了两个函数 fn,show和一个x变量,全局环境执行,导致fn的定义,定义后,函数fn的作用域链上就拿到了父环境的作用域链,简单点说,fn现在的作用域链上只有一个全局global对象,而global对象上只有两个函数,一个x变量。

2.声明阶段完成后,在全局环境下,调用了show这个函数,并且把函数fn这个函数的引用当成实参传进了show函数体内。

3.show函数体内,同样声明了一个x变量,但是这个x其实是添加到show函数的作用域上,还声明了一个立即执行函数,在立即执行函数中,执行了fn的引用。fn执行会生成自己的活动对象(Active Object),并将自己的活动对象放在作用域的第一位。这个时候fn函数的作用域链就是AO(fn)-->GO(Global Obect)。

4.函数执行时,查找作用链上是否有访问的变量,都是顺着作用域链查起,也就是说从自己的AO查起,到GO结束。当然有些特殊用法,也有意外,比如with的用法。从上面的例子可以看出,函数fn的作用域链和show的作用域链基本上没关系。所以也就访问不到show内部声明的变量x,fn打印的其实就是全局声明的x。

5.最后说明一下,这里放在立即执行函数内,只是一个烟雾弹,删掉立即执行函数也不会改变fn的作用域的,打印的结果同样是10。

var x = 10;

function fn(){

    console.log(x);

}

function show(f){

    var x = 20;

    f();

}

show(fn);

6.最后,再佐证下,fn和show的作用域没关系。这里在show内声明了一个m,如果fn和show的作用域有关系,打印m,应该可以打印出10,事实上没有找到m。

var x = 10;

function fn(){

console.log(m);

}

function show(f){

    var x = 20;

    var m = 10;

    (function () {

        f(m);

    })();

}

show(fn);

结果:

结果显示m未声明

相关文章

  • 立即执行函数与作用域问题1

    题目如下: var x = 10;function fn(){ console.log(x);}function...

  • 复习笔记之API(14)

    立即执行函数 立即执行函数:不需要调用,立马能够自己执行的函数作用:创建一个独立作用域,立即执行函数里面所有的变量...

  • 02- ES6 函数声明

    1、立即执行函数表达式 IIFE 用块级作用域写法,代替立即执行函数表达式IIFE。 IIFE写法: 用“块级作用...

  • 立即执行函数

    立即执行函数时前置 立即执行函数(IIFE)在 JS 非常常用,作用就是构造一个函数级的变量作用域 functio...

  • JavaScript难点

    原文链接 1、涉及知识点 JavaScript运行过程、预编译、执行期上下文、作用域、作用域链、立即执行函数、闭包...

  • 33,下面的代码打印什么内容

    IIFE: 立即执行函数表达式的由来。1,相对其他面向对象语言,JS的作用域控制手段很匮乏,只有全局作用域很函数作...

  • 一道面试题引发的讨论

    本文的示例代码参考scope 目录 面试题 作用域变量提升 块作用域重新绑定 函数作用域立即执行函数表达式 挑战题...

  • 变量函数提升与执行上下文

    变量与函数提升 作用域与执行上下文的区别 执行上下文 执行上下文栈 作用域 作用域链

  • 执行上下文、作用域链、this、闭包

    javascript 执行的是词法作用域,即静态作用域。与之相对的是动态作用域。 静态作用域:函数的作用域在函数定...

  • 闭包作用

    闭包的作用:模仿块作用域、保存变量、封装私有变量(1)模仿块作用域:通过构建立即执行函数 通过特权方法来访问(静态...

网友评论

      本文标题:立即执行函数与作用域问题1

      本文链接:https://www.haomeiwen.com/subject/xteqtqtx.html