JS学习之闭包、this关键字、预解释、作用域综合

 1     var num = 2;//window.number=2
 2     var obj = {
 3         num: 4, //obj.number=4
 4         fn: (function () {
 5             this.num *= 2; //自执行函数this是window的num,这里window的num=2*2=4
 6             num = num * 2; //undefiend
 7             var num = 3;
 8             return function () {
 9                 this.num *= 2;
10                 num *= 3;
11                 alert(num);
12             }
13         })(),
14         db2: function () {
15             this.num *= 2
16         }
17     };
18
19     var fn = obj.fn1;
20     alert(num);// 4
21     fn();// window.num=8  弹出9
22     obj.fn();//  obj.num=8  弹出9*3=27
23
24     alert(window.num); // 8
25     alert(obj.num);   // 8
从头到尾一步步分析上面的代码执行步骤:window下的预解释:    var num; var obj; var fn;window下的代码执行:    num=2;    obj=xxxfff000;    [开辟一个堆内存xxxfff000]        num:4        fn:自执行函数的返回值            形成一个不销毁的私有作用域-A            A下的预解释:                var num;            A下的代码执行:                this.num*=2;//window.num=4                num*=2;//num=undefined*2=NaN                num=3;                return function(){.} xxxfff111        fn:function(){//上级作用域就是A            this.num*=2;            num*=3;            console.log(num);        } xxxfff111

    fn=obj.fn; //fn=xxxfff111    console.log(num);//4    fn();        xxxfff111()行成一个私有的作用域        预解释:无        代码执行:            this.num*=2;//window.num=8            num*=3;//让上级作用域A中的num=9            console.log(num);//9    obj.fn();        xxxfff111()行成一个私有的作用域        预解释:无        代码执行:            this.num*=2;//obj.num=8            num*=3;//让上级作用域A中的num=27            console.log(num);//27    console.log(window.num);//8    console.log(obj.num);//8
时间: 2024-12-12 14:40:06

JS学习之闭包、this关键字、预解释、作用域综合的相关文章

[js]js的惰性声明, js中声明过的变量(预解释),后在不会重新声明了

js的惰性声明, js中声明过的变量(预解释),后在不会重新声明了 fn(); // 声明+定义 js中声明过一次的变量,之后在不会重新声明了 function fn() { console.log("ok") } fn(); //ok fn = 22; //赋值是允许的 fn(); // Uncaught TypeError: fn is not a function function fn() { console.log("ok !!!");} fn(); //

我理解的js中预解释

浏览器在执行代码前,先找带var和带function的地方,把带var的声明且赋予初始值undefined,把带function的声明且定义. 带var关键字预解释 让我们先看下这段代码执行的结果: alert(n);//弹出undefined var n = 10; 弹出的结果是undefined,为何不是10?让我们再看下面这段代码执行的结果: alert(n); n = 10; 运行报如下错误: 为何这次会报错,原因是代码在运行的时候,没有声明这个变量n:通过这两段代码的比较,我们发现带v

JavaScript那些事儿-预解释

带var关键字预解释 让我们先看下这段代码执行的结果: alert(n);//弹出undefined var n = 10; 弹出的结果是undefined,为何不是10?让我们再看下面这段代码执行的结果: alert(n); n = 10; 运行报如下错误:,为何这次会报错,原因是代码在运行的时候,没有声明这个变量n:通过这两段代码的比较,我们发现带var关键字和不带var关键字声明的变量是有区别的,带var声明的变量在代码执行之前,似乎浏览器已经给了它们一个初始值undefined,因此我们

扒一扒JavaScript 预解释

带var关键字预解释 让我们先看下这段代码执行的结果: 代码如下: alert(n);//弹出undefinedvar n = 10; 弹出的结果是undefined,为何不是10?让我们再看下面这段代码执行的结果: 代码如下: alert(n);n = 10; 运行报如下错误: 为何这次会报错,原因是代码在运行的时候,没有声明这个变量n:通过这两段代码的比较,我们发现带var关键字和不带var关键字声明的变量是有区别的,带var声明的变量在代码执行之前,似乎浏览器已经给了它们一个初始值unde

JS学习之预解释

预解释:在js中,代码从上到下执行之前,(浏览器默认)首先会把所有带var和function关键字的进行提前的声明或者定义声明(declare):相当于种树时候"挖坑" var num;(var一个变量) 只声明没有定义的时候,num的默认值是undefined定义(defined):相当于种树时候"栽树" num=12;(给变量赋值) 在预解释的时候,带var和带function的还不一样:var:只是提前的声明(定义赋值的部分是在代码执行的时候完成的)funct

JS 预解释相关理解

1.JS中的内存空间分为两种:栈内存.堆内存 栈内存:提供JS代码执行的环境;存储基本数据类型的值; ->全局作用域或者私有的作用域其实都是栈内存 堆内存:存储引用数据类型的值(对象是把属性名和属性值存储进去,函数是把函数体中的代码当做字符串存储进去) 2.当浏览器加载我们HTML页面的时候,首先会提供一个供JS代码执行的环境->全局作用域(global->window) 3.在JS代码执行之前,浏览器还需要自己做一些事情:把所有带var/function关键字的进行提前的声明或者定义

预解释,作用域,闭包的理解

一.预解释,就是当代码执行的时候.对变量的预声明. 1.第一步是首先会查找带var和function关键字的代码.对其进行预声明的过程.  对var的处理是先声明,然后赋值为undefined  function的处理是声明并赋值.此处的赋值为为function开辟一个新的堆内存空间,用于存储函数体内的字符.注意此处的存储的就是字符串,并非js代码.只有在执行的时候才会转变为js代码. 二.作用域 作用域和函数的定义有关系,和函数的执行没有关系. 三.闭包 闭包其实可以理解为,每一个函数执行都是

JS中的预解释

1.什么是预解释? 在当前作用域下,JS代码执行之前,首先会把带var/function关键字的进行提前的声明(declare)或者定义(defined). 2.预解释是如何操作的? a.带var关键字的在预解释阶段只完成了提前的声明:b.带function关键字的在预解释阶段完成了声明和定义两个操作. 3.预解释的注意点? a.不管条件判断是否成立,判断体中的内容都要进行预解释: 例如:if (!('a' in window)) { var a=12;  //判断'a'是否为window的一个

js学习笔记—转载(闭包问题)

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function