JS语言特征(来自Pro Javascript Techniques)
1、引用
引用指向的只能是具体的对象,而不是另一个引用。在执行字符串链接操作时,结果总会是一个新的字符串对象,而非原字符串的修改版本。
2、函数重载和类型检查
函数重载必须依赖两件事情:判断传入参数数量的能力和判断传入参数类型的能力。
1.判断传入参数数量
JavaScript的每个函数都带有一个仅在这个函数范围内作用的变量(contextual variable)称为参数(argument),它是一个包含所有传给函数的参数的伪数组(pseudo-array),所以它并非真正意义的数组(也就是说你不能修改它,也不能用push()来添加新元素),但可以访问其中的元素,也具有.length属性。
2.判断传入参数类型
JavaScript的类型检查有两种特别有用的方法:
第一种方法是使用typeof操作符。这个工具提供了一个字符串名称,用于表达变量内容的类型。当变量不是object或array类型时,这是最完美的解决方法了。但是对于自定义的对象就不能用这个方法进行类型检查,因为它只返回object,很难跟其他的object区分开来。
第二种检查对象类型的方法,需要引用所有JavaScript对象都带有的一个属性,称为构造函数(construstor)。这个属性引用的是原本用来构造该对象的那个函数。
3、作用域
在Javascript里,作用域是由函数划分的,而不是由块(block)划分的。基于浏览器的Javascript的一个有趣特征是,所有属于全局作用域的变量其实都是window对象的属性。如果变量没有显式定义,它就是全局定义的,虽然它可能只在这个函数作用域的范围内使用。
闭包
闭包(closure)意味着内层的函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经终止。
闭包能实现的额外作用:
1、在一些函数式程序设计语言里,有一种称为Curry化的技术。本质上,Curry化是一种通过把多个参数填充到函数体中,实现将函数转换为一个新的经过简化的(使之接受参数更少)函数的技术。
function addGenerator(num)
{
//返回一个函数
return function(toAdd)
{
return num+toAdd;
};
}
var addFive=addGenerator(5);
aler(addFive(4)==9);
2、通过自执行的匿名函数你可以把所有原本属于全局的变量都隐藏起来。
(
function()
{
//这个变量如果没有用自执行的匿名函数包围起来那么它就是全局的
var msg="Thanks for visiting!";
window.onunload=funtion()
{
alert(msg);
};
}
)();
3、使用匿名函数来激发出创建多个使用闭包的函数所需的作用域
var obj=document.getElementById("main");
var items=["click","keypress"];
for(var i=0;i<items.length;i++)
{
(
function()
{
var item=item[i];
obj["on"+item]=funciton()
{
alert("Thanks for your "+item);
};
}
)();
}
4、上下文对象
在Javascript中,代码总是有一个上下文对象(代码处在该对象内)。上下文对象是通过this变量体现的,这个变量永远指向当前代码所处的对象中。全局对象其实是window对象的属性。这意味着即使是在全局上下文中,this变量也能指向一个对象。Javascript提供了call和apply两个方法,可以使用这两个方法改变上下文对象。
![](https://img2024.cnblogs.com/blog/35695/202408/35695-20240826070647288-243310440.jpg)