JS---Tom大叔五道题&&其他博客、帖子梳理

来源:互联网 发布:python马踏棋盘算法 编辑:程序博客网 时间:2024/06/03 13:11

http://www.cnblogs.com/TomXu/archive/2012/02/09/2330578.html
Tom大叔,5道题目

1.

if (!("a" in window)) {    var a = 1;}a;//undefined

等价于:

var a;if(!('a' in window)){    a=1;}a;//undefined

①所有全局变量都window的属性,var a=1;等价于window.a=1;
②检验全局变量是否声明的方法:”变量名称” in window
③所有的变量声明都在范围作用域的顶部。
④var a=1;包括了变量声明和变量赋值。——
var a;//声明
a=1;//初始化赋值

2.

var a = 1,    b = function a(x) {        x && a(--x);    };alert(a);//1

等价于

var a = 1,    b = functin(x){        x && b(--x);    };alert(a);//1

Analysis:该题中,变量a声明并初始化赋值为1,同时有个同名的函数,并将其保存在变量b中,此时函数a被变量a所覆盖,因此alert(a)为1。

①变量声明在进入执行上下文就完成了。(var a)
②函数声明也是提前的,所有的函数声明都在执行代码之前就已经完成了声明。
③函数声明会覆盖变量声明,但不会覆盖变量赋值。

//在同名变量没有赋值的情况下,同名函数的优先级大于同名变量,因此覆而盖之function value(){    return 1;}var value;typeof(value);//"function"//变量value赋值了,那就不一样了function value(){    return 1;   }var value=2;typeof(value);//number

3.

function a(x) {    return x * 2;}var a;alert(a);//函数a

①当变量和函数同名时,在变量没有赋值的情况下,同名变量被覆盖掉。
②当变量和函数同名时,如果变量初始化赋值了,那么同名函数被覆盖掉。

4.

function b(x, y, a) {    arguments[2] = 10;    alert(a);//10}b(1, 2, 3);

①活动对象是进入函数上下文时刻被创建的,它通过函数的arguments属性初始化。

②arguments属性的值是Arguments对象。

③Arguments对象是活动对象的一个属性,包括如下属性:
a)callee—-指向当前函数的引用。
b)length—真正传递的参数个数。
c)properties-indexes(字符串类型的整数)属性的值就是函数的参数值(按参数列表从左向右排列),properties-indexes内部元素的个数等于arguments.length。properties-indexes的值和实际传递进来的参数之间是”共享”的。

④这个”共享”其实并不是真正意义上的共享同一个内存地址,而是两个不同的内存地址,使用JS引擎来保证这两个值是时刻保持一样的,这需要一个前提—-该索引值要小于你传入参数的个数。

function b(x,y,a){    arguments[2]=10;    console.log(a);//undefined}b(1,2);

5.

function a() {    alert(this);//[object,Window]}a.call(null);

等价于

//null/undefined 作为第一个参数均转化为全局对象(window)function a(){    alert(this);//[object Window]}a.call(window);function a(){    alert(this===window);//true}a.call(window);

①this值是如何定义的:当一个方法在对象上调用的时候,this就指向了该对象。object.method();

var object={    method:function(){        alert(this===object);//ture    }}object.method();

②如果一个函数的定义不是属于一个对象属性的时候(也就是单独定义的函数),该函数内部的this等价于window的。

function method2(){    alert(this===window);//true}method2();

6.this
①this是一个与执行上下文相关的特殊对象。因此,可以称作上下文对象(用来指明执行上下文是哪个上下文中所触发的对象)。

②this是执行上下文的一个属性,而不是变量对象的一个属性。

zeromike的深入分析:
https://www.zhihu.com/question/36751764

7.变量对象是一个与执行上下文相关的特别对象,主要存储:①声明的变量 ②函数声明 ③在上下文中,函数声明的形式参数。

8.[[scope]]是在函数创建的时候被保存起来的—静态的(不变的),直至该函数被销毁。
https://segmentfault.com/q/1010000005839904

9.函数其实就是一个对象,在这个对象里保存了如下的值:函数形参的名字,当前执行环境,函数体的代码。
①形参的名字就是一个字符串数组。
②函数体代码也就是个字符串。

10.函数定义就是一段代码,执行到这段代码之前,这个函数是”抽象”的存在。

11.实际的执行环境实在函数调用的时候创建的。

原创粉丝点击