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。