您的位置:首页 > Web前端 > JavaScript

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

2017-07-19 10:09 218 查看
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.实际的执行环境实在函数调用的时候创建的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息