JS作用域与闭包--实例

    //函数作用域
        function func(){
            var arr = [1,3,5,7,9];
            var sum = 0;
            for(var i = 0,len = arr.length;i < len;i ++){
                sum += arr[i];
            }
            console.log("%d\t\n%d",i,sum);
        }
        func();
        //5
        //25

        //闭包特性
        var outter = [];
        function clouseTest(){
            var arr = ["one","two","three","four"];
            for(var i = 0, len = arr.length;i < len;i ++){
                var x = {};
                x.no = i;
                x.text = arr[i];
                x.invoke = function(){
                    console.log("%d\t\n%o\t\n%d\t\n",i,this,this.no);
                };
                outter.push(x);
            }
        }

        clouseTest();
        for(var i = outter.length - 1;i >= 0;i --){
            outter[i].invoke();
        }
        //4
        //Object { no=3, text="four", invoke=function()}
        //3

        //4
        //Object { no=2, text="three", invoke=function()}
        //2

        //4
        //Object { no=1, text="two", invoke=function()}
        //1

        //4
        //Object { no=0, text="one", invoke=function()}
        //0

        //关于i输出的都是4的解释:因为,在每次迭代的时候这样的语句x.invoke=function(){console("%d",i);}并没有
        //被执行,只是构建了一个函数体为“console.log("%d",i);”的函数对象,如此而已。而当i = 4时,迭代停止,外部函数返回
        //当再去调用outter[i].invoke()时,i的值依旧为4,因此outter数组中的每一个元素的invoke都返回i的值为4.

        //引用
        var obj = {};//空对象
        var ref = obj;//引用
        obj.name = "objectA";//
        console.log(ref.name);//ref跟着刚添加的name属性
        obj =  ["one","two","three","four"];//obj指向了另一个对象(数组对象)
        console.log(ref.name);//ref还指向原来的对象
        console.log(obj.length);//3
        console.log(ref.length);//undefined

        //objectA
        //objectA
        //3
        //undefined
时间: 2024-10-11 13:43:48

JS作用域与闭包--实例的相关文章

js 作用域,闭包及其相关知识的总结

面试必问题,闭包是啥有啥子用,觉得自己之前回答的并不好,所以这次复习红皮书的时候总结一下. 提到闭包,相关的知识点比较多,所以先罗列一下要讲的内容. 1. 作用域链,活动对象 2. 关于this对象 3. 垃圾回收机制,内存泄漏 4. 模仿块级作用域,私有变量 涉及的内容这么多,也难怪面试官喜欢问这个问题啊,就像niko大神说的,应该是根据回答的深浅了解你的思维模式吧.废话不多说,开始步入正题. 1. 作用域链,活动对象 活动对象:活动对象就是在函数第一次调用时,创建一个对象,在函数运行期是可变

js——作用域和闭包

1. js是编译语言,但是它不是提前编译,编译结果不能在分布式系统中移植.大部分情况下,js的编译发生在代码执行前的几微秒(甚至更短) 2. 一般的编译步骤 分词/词法分析:把字符串分解成词法单元 解析/语法分析:将词法单元转换成一个由元素组成的语法结构树,抽象语法树AST 代码生成:将AST转换成一组机器指令 3. 三个工具 引擎:控制整个程序的编译及执行过程 编译器:负责语法分析及代码生成等 作用域:收集并维护所有声明的标识符的访问权限 4. var a = 2 的编译过程 var a=2;

js系列-3 js作用域与闭包

4,函数作用域中可用arguments来获取函数实参,arguments虽然可以通过下标访问,但它不是数组,原型不是Array.prototype. 它是实参的一个副本,通过arguments可模拟方法的重载.    function add(){        if(arguments.length == 1){           alert(1);        }        if(arguments.length == 2){           alert(2);        }

Js作用域与闭包

在JavaScript中,作用域是执行代码的上下文.作用域有三种类型:全局作用域.局部作用域(或“函数作用域”)和eval作用域. 在函数内部使用var定义的代码,其作用域是局部的. var foo = 0; // 全局作用域 console.log(foo); // 0 var myFunction = function() { console.log(foo); // undefined (下面var foo的声明在此作用域提升) var foo = 1; // 局部作用域 console.

JS闭包实例介绍

JS作用域链讲起来麻烦,本来很好懂的东西,书上讲的很混乱. 先撇开作用域的概念.采用自顶向下的方法来说明,可能会好点. 好,其实全局变量和局部变量大家都懂得.全局变量很容易理解,就是一个内存共享原理. 局部变量是是只属于它的父级(其实就是作用域),也就是说我们必须要找到父级才能找到它. 有没有办法让我们从外部访问局部变量,而不用每次去找它的父级. 比如: var a = 'out'; var f = function(){ var i = 'in'; //var表示声明 i 为局部变量,并定义它

解析js中作用域、闭包——从一道经典的面试题开始

如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎么写,是不是这样? 可是结果呢,弹出来的都是10,为啥? var i,a for(i=0;i<10;i++){ a=document.createElement('a') a.innerHTML=i+'<br>' a.addEventListener('click',function(eve

JS中的作用域和闭包

作用域:在编程语言中,作用域控制着变量与参数的可见性及生命周期.JS确实有函数作用域,那意味着定义在函数中的参数和变量在函数外部是不可见的,而且在一个函数中的任何位置定义的变量在该函数中的任何地方都是可见的. var a = 1; var fs = function (){ var b = 2; var c = 4 var fun = function (){ var c = 3; alert(a) //输出1 alert(b) //输出2 alert(c) //输出3 } fun(); } f

js 闭包实例

var db = (function() { // 创建一个隐藏的object, 这个object持有一些数据 // 从外部是不能访问这个object的 var data = {}; // 创建一个函数, 这个函数提供一些访问data的数据的方法 return function(key, val) { if (val === undefined) { return data[key] } // get else { return data[key] = val } // set } // 我们可

js最基础知识回顾3(字符串拼接,数据类型,变量类型,变量作用域和闭包,运算符,流程控制,)

一.javaScript组成     1.ECMAScript:解释器.翻译 ---------------------------------------------------------几乎没有兼容性问题     2.DOM:Document Object Model --------操作HTML的能力----document--------有一些兼容性问题     3.BOM:Browser Object Model -------------浏览器---------------wind