JavaScript之引用类型介绍(8)


function callSum2(num1,num2)
{
return sum.call(this,num1,num2);
}
alert(callSum2(10,10)); //20


  事实上,传递参数并非apply()和call()真正的用武之地;它们真正强大的地方是能够扩充函数赖以运行的作用域。看下面的例子:

复制代码 代码如下:


window.color = 'red';
var o = {color:'blue'};

function sayColor()
{
alert(this.color);
}

sayColor(); //red
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue


  在上面的例子中,当运行sayColor.call(o)时,函数的执行环境就不一样了,因为此时函数体内的this对象指向了o,于是结果显示"blue"。

  注意:每个函数都有一个非标准的caller属性,该属性指向调用当前函数的函数。一般是在一个函数的内部,通过arguments.callee.caller来实现对调用栈的追溯。目前,IE、FireFox、Chrome都支持该属性,但建议将该属性用于调试目的。

内置对象
  JavaScript中有两个内置对象:Global和Math。

 Global对象
  Global(全局)对象可以说是JavaScript中最特别的一个对象了,因为不管你从什么角度上看,这个对象都是不存在的。JavaScript中的Global对象在某种意义上是作为一个终极的“兜底儿对象”来定义的。换句话说,不属于任何其他对象的属性和方法,最终都是它的属性和方法。事实上,没有全局变量或全局函数;所有在全局作用域定义的属性和函数,都是Global对象的属性。诸如isNaN()、parseInt()以及parseFloat(),实际上全都是Global对象的方法,Global对象还包含其他一些方法。

  URI编码方法
  Global对象的encodeURI()和encodeURIComponent()方法可以对URI进行编码,以便发送给浏览器。有效的URI中不能包含某些字符,例如空格。而这两个URI编码方法就可以对URI进行编码,它们用特殊的UTF-8编码替换所有无效的字符,从而让浏览器能够接受和理解。

  其中,encodeURI()主要用于整个URI(例如: value.html),而encodeURIComponent()主要用于对URI中的某一段(例如前面URI中的test value.html)进行编码。它们主要区别在于,encodeURI()不会对本身属于URI的特殊字符进行编码,例如冒号、正斜杠、问好和井号;而encodeURIComponent()则会对它发现的任何非标准字符进行编码。

复制代码 代码如下:


var uri = "http://www.test.com/test value.html#start";
//"http://www.test.com/test%20value.html#start"
alert(encodeURI(uri));
//"http%3A%2F%2F%2Ftest%20value.html%23start"
alert(encodeURIComponent(uri));


  一般来说,使用encodeURIComponent()方法的时候要比使用encodeURI()更多,因为在实践中更常见的是对查询字符串参数而不是对基础URI进行编码。

  与encodeURI()和encodeURIComponent()方法对应的两个方法分别是decodeURI()和decodeURIComponent()。其中,decodeURI()只能对encodeURI()替换的字符进行解码,同样,decodeURIComponent()只能对encodeURIComponent()替换的字符进行解码。

  eval()方法
  eval()方法大概是JavaScript中最强大的一个方法了,eval()方法就像是一个完整的JavaScript解析器,它只接受一个参数,即要执行的字符串。看下面的例子:

  eval("alert('hi')");
  这行代码的作用等价于下面这行代码:

  alert('hi');
  当解析器发现代码中调用eval()方法时,它会将传入的参数当做实际的JavaScript语句来解析,然后把执行结果插入到原位置。通过eval()执行的代码被认为是包含该次调用的执行环境的一部分,因此被执行的代码具有与该执行环境相同的作用域链。这意味着通过eval()执行的代码可以引用在包含环境中定义的变量,例如:

var msg = 'hello world';
eval('alert(msg)'); //hello world
  可见,变量msg是在eval()调用的环境之外定义的,但其中调用的alert()仍然能够显示“hello world”。这是因为上面第二行代码最终被替换成了一行真正的代码。同样地,我们也可以在eval()调用中定义一个函数,然后再在该调用的外部代码中引用这个函数:

eval("function sayHi(){alert('hi')}");
sayHi();
  注意:能够解释代码字符串的能力非常强大,但也非常危险。因此在使用eval()时必须极为谨慎,特别是在用它执行用户输入数据的情况下。否则,可能会有恶意用户输入威胁你的站点或应用程序安全的代码(即所谓的代码注入)。

 Math对象
  与我们在JavaScript直接编写的计算功能相比,Math对象提供的计算功能执行起来要快得多。Math对象还提供了辅助完成这些计算的属性。

属性 描述
E   返回算术常量 e,即自然对数的底数(约等于2.718)。  
LN2   返回 2 的自然对数(约等于0.693)。  
LN10   返回 10 的自然对数(约等于2.302)。  
LOG2E   返回以 2 为底的 e 的对数(约等于 1.414)。  
LOG10E   返回以 10 为底的 e 的对数(约等于0.434)。  
PI   返回圆周率(约等于3.14159)。  
SQRT1_2   返回返回 2 的平方根的倒数(约等于 0.707)。  
SQRT2   返回 2 的平方根(约等于 1.414)。  

Math对象包含的方法如下:

方法 描述
abs(x)   返回数的绝对值。  
acos(x)   返回数的反余弦值。  
asin(x)   返回数的反正弦值。  
atan(x)   以介于 -PI/2 与 PI/2 弧度之间的数值来返回 x 的反正切值。  
atan2(y,x)   返回从 x 轴到点 (x,y) 的角度(介于 -PI/2 与 PI/2 弧度之间)。  
ceil(x)   对数进行上舍入。  
cos(x)   返回数的余弦。  
exp(x)   返回 e 的指数。  
floor(x)   对数进行下舍入。  
log(x)   返回数的自然对数(底为e)。  
max(x,y)   返回 x 和 y 中的最高值。  
min(x,y)   返回 x 和 y 中的最低值。  
pow(x,y)   返回 x 的 y 次幂。  
random()   返回 0 ~ 1 之间的随机数。  
round(x)   把数四舍五入为最接近的整数。  
sin(x)   返回数的正弦。  
sqrt(x)   返回数的平方根。  
tan(x)   返回角的正切。  
toSource()   返回该对象的源代码。  
valueOf()   返回 Math 对象的原始值。  

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wddpzy.html