So, you think you know JavaScript?

米浩穰
2023-12-01
<script type="text/javascript">
//So, you think you know JavaScript? 
//demo-01:
if (!("a" in window)) {
    var a = 1;
}
console.log(a);//undefined

//demo-02:
var a = 1,
    b = function a (x) {
        x && a (--x);
    };
console.log(a);//1

//demo-03
function a(x) {
	return x * 2;
}
var a;
console.log(a);//function a(x){...}
//其实此处是变量提升即:
var a;
function a(x){
	return x*2;
}
//或者:
var a=function(x){
	return x*2;
}

//demo-04

function b (x, y, z, k) {
	var x=5;
	var y;
	console.log(arguments.length);//3
	console.log(x);//5
	console.log(y);//2
	console.log(arguments[0]);//5
	console.log(k);//undefined
    arguments[2] = 10;
    console.log(z);//10
}
b(1, 2, 3);
/*
首先,我们来了解两个概念,形式参数和实际参数。形式参数指的是定义方法时所明确指定的参数,
由于Javascript语言的灵活性,javascript并不要求方法调用时,所传递的参数个数与形式参数一致.
而javascript实际调用时所传递的参数就是实际参数。arguments指的就是实际参数。从say方法中可以看出,
say定义了四个形式参数,而实际调用时只传递了三个值。因此arguments.length的值为3,而不是4.接着我们来看一下arguments的特殊行为,
个人感觉arguments会将所有的实际参数都当作对象来看待,对于基本数据类型的实际参数则会转换为其对应的对象类型。
这是根据在函数内定义与形式参数同名的变量并赋值,arguments对应的值会跟着改变来判断的。
接着我们来分析一下构建b方法执行上下文的过程,由于逻辑比较复杂,
*/
function b(x,y,z,k){

	//先对函数声明的变量进行'预解析'
	var x=undefined;
	var y=undefined;
	var z=undefined;
	var k=undefined;
	
	//再对函数内部声明的变量进行'预解析'
	var x=undefined;//无意义
	var y=undefined;//无意义
	
	//对实际参数进行赋值
	x = new Number(1);//arguments的会将所有实际参数当作对象看待
	y = new Number(2);
	z = new Number(3);
	
	//正式进入函数代码部分
	x=5;
	y;//被'预解析了,不会再执行'
	console.log(arguments.length);//3
	console.log(x);//5
	console.log(y);//2
	console.log(arguments[0]);//5
	console.log(k);//undefined
    arguments[2] = 10;//此处更改的是实际参数(arguments)
    console.log(z);//10
}
/*
下面我们再来看看此函数作用域及作用域链:
首先,我们知道每一个javascript函数都被表示为对象,进一步说,他是函数的一个实例,
函数对象正如其他对象那样,有一些可以编程访问的属性,还有一些不能被程序访问,只能javascript内部引擎使用的属性
如[[scope]]属性,此属性包含一个函数创建作用域中对象的集合,此集合被称为函数的作用域链,它决定哪些数据可由函数访问,
此函数作用域链中的每个对象都是一个可变对象,每个可变对象都以"键值"对存在,当函数创建后,它的作用域链被填充以对象,
这些对象代码创建此函数中可访问的数据。
===>当b()方法被创建时,它的作用域链中被创建了一个单独的可变对象,此全局对象代表了所有全局范围内定义的变量。
*/



</script>
待续中....


 

 类似资料: