作用域闭包、预解释和this关键字综合题目

var number = 2;
var obj = {number : 5,
    fn1 : ( function() {
	this.number *= 2;
	number=number*2;
 	var number=3;
		return function() {
			this.number *= 2;
			number*=3;
			alert(number);
		}
    } )()
};
var fn1 = obj.fn1;
alert(number);
fn1();
obj.fn1();
alert(window.number);
alert(obj.number);

【解析】
1.fn1本身后面就有(),所以var fn1 = obj.fn1;时他已经被执行,但是里面的return function并没有被执行

2.alert(number);输出全局的number,本来是2,经过var fn1 = obj.fn1;后,相当于执行了

this.number *= 2;
number=number*2;
var number=3;

这三句话

注意:任何一个直接执行的匿名方法,他的this指向window

所以this.number *= 2;使得全局变量变成4,即输出4

而number=number*2;他是去看作用域块里的number,var number=3;作用域声明在先,但是没有赋值,所以number=number*2;这句话其实没用

3.执行到fn1();就是执行fn1里面的return function,也就是这三句话

this.number *= 2;
number*=3;
alert(number);

这时候依然是个匿名方法,所以this.number *= 2;使得全局变量变为8,number*=3;去找作用域块里的number,外层定义number为3,所以alert(number);就是9,如果是alert(this.number);则指向全局变量,即输出8

4.obj.fn1();,依然执行fn1里面的return function,也就是这三句话

this.number *= 2;

number*=3;

alert(number);

但这时this指向obj,this.number *= 2;使得obj里的number变为10,number*=3;还是去找作用域块,由于上面变为9,所以这里就是27,alert(number);输出的是作用域块的number,即27,如果是alert(this.number);则指向obj的number,即输出10

5.alert(window.number);经过上面几轮,全局变量变为8(即执行obj.fn1();对全局变量无影响)

6.alert(obj.number);只有这句话obj.fn1();,改变了obj.number,所以输出10

时间: 2024-10-07 01:22:05

作用域闭包、预解释和this关键字综合题目的相关文章

[js]js栈内存的全局/私有作用域,代码预解释

js代码如何执行的 浏览器提供执行环境: 全局作用域(提供js执行环境, 栈内存) --> 执行js需要预解释 - 带var : 提前声明 - 带function关键字的: 提前声明+定义 js中的栈内存(对应全局/私有作用域)和堆内存 <script> // 基本: num str boollen null undefied // 引用: [] {} \^$\ Date var num = 12; var obj = {name: "maotai", age: 22

吃透【预解释】,从此再也不用担心!

Author:李金涛 Form:光环国际 Time:2017-12-31 23:49(跨年夜的最后一刻,我在辛勤耕耘我的"预解释",收获满满,甚喜!) 定义:预解释(变量提升):js在运行前,先把所有带var和function关键字的提前声明或定义.且预解释是发生当前作用域下的. 1,全局预解释阶段: (1)全局作用域与全局变量:当浏览器加载HTML页面的时候,首先会提供一个供全局JavaScript代码执行的环境,称之为全局作用域(global/ window).在window全局作

JS中的预解释

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

预解释的初级理解

1.当浏览器加载html页面的时候,提供一个全局js代码执行的环境,即全局作用域 2.预解释:在当前作用域中,js代码执行之前浏览器会首先把var定义,把function定义且赋值(遇到function开一个内存空间地址,里面存函数内容的字符串) 3.预解释只发生在当前作用域,,如开始在window下预解释 函数执行的时候才会对函数中预解释因为作用域变了 4.js中内存的分类:栈内存和堆内存,栈内存用来提供js执行的环境(全局作用域 私有作用域),堆内存是存储引用数据类型的值(对象的键值对,函数

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

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

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

课程笔记:——Javascript 中的预解释

1.预解释(变量提升):在当前作用域下,JS代码执行之前,浏览器首先会把所有带var和function关键字的进行提前的声明或者定义var num = 12;声明(declare): var num; -->声明的时候没有赋值,我们的默认值是undefined定义(defined): num=12; 2.带var和带function的预解释不一样:var:在预解释的时候,只声明未定义(只有代码执行的时候才会完成赋值定义)function:在预解释的时候,声明和定义一起完成了(当代码在执行到定义的

JS 预解释相关理解

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

作用域闭包

1.引言 最近在刷leetcode题的时候,遇到一个求最长回文子串的题目,于是,我写了如下的代码: class Solution(object): def longestPalindrome(self, s): """ :type s: str :rtype: str """ if len(s) < 2: return s maxlen = 0 res = '' for i in range(len(s) - 1): str1 = self