日期:2014-05-16  浏览次数:20314 次

学习笔记:Javascript真让人晕
JS的函数特殊性:JS中的函数可以被当做一种数据类型来看待,是真正的数值,因此可以被存储在变量数组和对象中,也可以作为参数传递给其他的函数,可以被赋值给某个对象的属性。
定义一个概念:函数直接量(function literal),见例子:
//使用函数定义来定义函数
function square(x){
	return x*x;
}
//使用函数直接量来定义:
var squre = function(x){return x*x;}

两者之间的最大差别是函数直接量可以出现在其他JavaScript表达式中。

变量:如果省去var,则隐式声明的变量是全局变量,即便是在方法体中声明的,看例子:
var i=0;
function square(x){
	var j=i;
	//j=i;
}
square(i);
alert(typeof(j));

    例子中,如果使用var j=i声明j,则j只是方法中的局部变量,所以得到undefined。而如果改成j=i,隐式声明变量为全局变量,得到number。
    另外,在函数体内部,局部变量的优先级比全局变量的优先级要高。函数可以嵌套定义...在函数中声明的所有变量,无论是在哪里声明的在整个函数中他们都是有定义的。读起来好难理解啊,看例子:
function square(x){
	var i=0;
	var j=0;
	for(var k=0;k<10;k++){
		document.write(k);
	}
	document.write(k);
	document.write(j);
	alert(i+","+j+","+k);
}
square(1);//得到0,0,10,而不是0,0,undefined

再看
var param="global";
function t(){
	alert(param);//得到global,全局变量其起作用
}
t();

var param="global";
function t(){
	alert(param);//得到undefined。其实在这里局部变量param已经定义了
	var param="local";
	alert(param);//得到local
}
t();//函数t中声明了局部变量,局部变量的优先级高于全局变量

觉得不可思议吗?因为JS与C、Java等语言不同,没有块级作用域这个概念,只要在函数体中声明了这个变量,那么再整个函数体中都有它的定义,无论是变量声明前的代码还是变量声明后的代码。区别只是:前面的代码这个变量的值为undefined,而后面的代码可能赋值了。

typeof运算符:检测运算数的类型:
  • 数字、字符串、或者布尔值:返回number,string和boolean
  • 对象、数组和null:返回object
  • 函数:function
  • Number、String、Boolean和Date、RegExp:返回object
  • 未定义:undefined


delete运算符:删除运算数所指定的对象的属性、数组元素或变量。如果删除成功则返回true,如果运算数不能被删除则返回false。如用var声明的变量和客户端的属性就不能被删除。如果delete使用的运算数不是存在的属性、数组元素或变量时,它将返回true(或许认为操作后的结果是该变量不存在了,因此可以看做是删除成功,故返回true)。看例子:
var o={x:1,y:2};
alert(delete o.x);//删除对象的属性,返回true
alert(typeof o.x);//undefined
alert(delete(o.x));//删除不存在的属性,返回true
alert(delete o);//o是用var声明的,不能删除,返回false
alert(delete 1);//不能删除一个整数,返回false
x=1;
alert(delete x);//可以删除没用var声明的变量,返回true
alert(":"+typeof(x));//undefined


void运算符:他可以出现在任何类型操作数之前,它总是舍弃运算数的值,然后返回undefined。这在客户端的javascript:URL中经常使用,如:
<a href="javascript:void window.open();">Open New Window</a>

另外,void(0)和undefined的作用相同,在此void(0)可以看做用于产生undefined。