01 深入理解函数作用域&闭包

作者: 陈柯梦 | 来源:发表于2018-12-24 10:59 被阅读0次

演示代码

<html>
    <body>
        <script type="text/javascript">
        "use strict"
            console.log(`function define is first====》${reObject}`);
            console.log(`var define is order====》${a}`);

            var x = 1;
            function reObject() {
                return x;
            }
            console.log(`scope chain====》${reObject()}`);

            function reNull() {
                return null;
            }

            function reUndefined() {
                //console.log("reUndefined");
            }

            function reFunction() {
                var n = 1;
                return function() { 
                        console.log(`闭包函数 返回 内部对象n====》${n}`);
                        // console.log(reFunction);
                    };
            }

            var a = reObject();
            console.log(`reObject return====》${a}`);
            var b = reNull();
            console.log(`reNull return====》${b}`);
            var c = reUndefined();
            console.log(`reUndefined return====》${c}`);
            var d = reFunction();
            console.log(`reFunction return====》${d}`);
            console.log(`reFunction() return====》${d()}`);

            x = 2;
            var e = reObject();
            console.log(`scope chain x====》${x}:reObject a====>${a}:reObject e====>${e}`);
         </script>
    </body>
</html>

函数定义式优先于对象直接量

console.log(`function define is first====》${reObject}`);
console.log(`var define is order====》${a}`);
function reObject() {
    return x;
}
var a = reObject();

函数返回变量值拷贝

var x = 1;
function reObject() {
    return x;
}
console.log(`scope chain====》${reObject()}`);
x = 2;
var e = reObject();
console.log(`scope chain x====》${x}:reObject a====>${a}:reObject e====>${e}`);

函数返回值的本质

var a = reObject();
console.log(`reObject return====》${a}`);
var b = reNull();
console.log(`reNull return====》${b}`);
var c = reUndefined();
console.log(`reUndefined return====》${c}`);
var d = reFunction();
console.log(`reFunction return====》${d}`);
console.log(`reFunction() return====》${d()}`);

当函数返回值为非函数时,返回的为简单对象,而当返回值为函数时,返回的为函数的引用,
其实函数即作用域,整个JavaScript对象都在顶层作用域内

var d = reFunction();
console.log(`reFunction return====》${d}`);
console.log(`reFunction() return====》${d()}`);

可以思考下,下面这句会打印什么?

console.log(`reFunction() return====》${d()}`);

d()执行时会调用函数定义的方法,同时它的执行本身没有任何返回值


闭包的本质

相关文章

  • javascript函数,以及闭包的理解

    javascript函数,以及闭包的理解 深入理解javascript函数定义与函数作用域深入理解javascri...

  • 2018-07-11

    深入理解闭包: 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非...

  • JavaScript中的闭包

    理解闭包,首先必须理解变量作用域。前面提到,JavaScript 有两种作用域:全局作用域和函数作用域。函数内部可...

  • 深入理解js闭包

    深入理解js闭包 1.闭包的含义 1.1 闭包:有权在一个函数内部可以访问另一个函数作用域并且将此函数返回 2.想...

  • JavaScript中的闭包

    1.什么是闭包 要理解什么是闭包,就得先理解变量的作用域。在JavaScript中,有两种作用域,全局作用域和函数...

  • 14.JS基础之作用域与闭包

    作用域: 全局作用域 函数作用域 块级作用域(ES6新增) 常见的闭包有:作为函数返回值的闭包与作为函数参数的闭包...

  • 作用域和闭包

    目录 概述 作用域编译过程词法作用域全局作用域函数作用域 闭包循环和闭包闭包的用途性能 总结 概述 作用域和闭包一...

  • js原型和闭包(2)——函数和对象的关系

    深入理解javascript原型和闭包(2)——函数和对象的关系 文(理解javascript原型和作用域系列(1...

  • Python中的闭包是什么?

    目录 作用域(scope) 闭包的定义 闭包的作用 总结 2018.4.15更新了对于函数作用域的理解内容 1.作...

  • JavaScript深入理解-闭包(Closure)

    推荐文章:学习Javascript闭包(Closure)- 阮一峰javascript深入理解-从作用域链理解闭包...

网友评论

    本文标题:01 深入理解函数作用域&闭包

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