函数(call,apply对象冒充,arguments.callee调用自身)

function box(){
return '我只有被调用才可以执行!' //return表示把这句话字符串返回回来
}

alert(box());

------------------------------------------------------------------------------
function box(){
return; //当一个函数遇到第一个return,就会终止函数继续往下执行
return 100;
}
alert(box());

function box(num){
if(num<5)return num;
return 100;
}
alert(box(6));

------------------------------------------------------------------------------
arguments对象
function box(){
return arguments[0]+'|'+arguments[1]+'|'+arguments[2]+arguments[3];
}
alert(box('a',23,'计算机')); //a|23|计算机undefined


function box(){
return arguments.length;
}
alert(box('a',23,'计算机')); //3

例如:
function box(){
var sum=0;
for(var i=0;i<arguments.length;i++){
sum+=arguments[i];
}
return sum;
}
alert(box(1,3));

------------------------------------------------------------------------------
不具备重载功能。

 

------------------------------------------------------------------------------------------------------------------
函数的声明方式:

function box(num1,num2){ //普通函数的声明方式
return num1+num2;
}
alert(box(1,2));


var box=function(num1,num2){ //使用变量初始化函数
return num1+num2;
}
alert(box(1,2));

var box=new Function('num1','num2','return num1+num2'); //使用new的构造函数来声明函数 这种方式需要解析两次代码,
不推荐使用
alert(box(1,2));
alert(typeof box); //function

----------------------------------------------------------------

把函数本身作为参数传递,而不是函数的结果

function box(sum,num){
return sum(num);
}

function sum(num){
return num+10;
}
var result=box(sum,10);
alert(result); //20

----------------------------------------------------------------
函数内部的属性 arguments.callee this

function box(num){
if(num<=1){
return 1;
}else{
return num*box(num-1); //4*3*2*1=24 阶乘,递归
}
}
alert(box(3));

如果有一天我改为 function sum(num){} sum(3)

注意:对于阶乘函数一般要用到递归算法,所以函数内部一定会调用自身,如果函数名不改变是没有问题的,但一旦改变函数名,
内部的自身调用需要逐一修改,为了解决这个问题,我们可以使用arguments.callee来代替

function box(num){
if(num<=1){
return 1;
}else{
return num*arguments.callee(num-1); //使用arguments.callee,调用自身,实现递归
}
}
alert(box(3));


// window是一个对象,而且是JS里面最大的对象,是最外围的对象
alert(window); //[object Window]
alert(typeof window); //object window是对象,类型是对象,window表示全局
alert(this); //[object Window] this目前表示的是window,因为在window的范围下
alert(typeof this); //object 和window一模一样,所以this就是window

var color='红色的'; //这里color就是全局变量,而这个变量又是window的属性
alert(window.color); //红色的 这里已经很好的说明color是window下的属性
alert(this.color); //红色的

window.color='红色的'; //相当于 var color='红色的';
alert(this.color); //红色的

例子:
window.color='红色';
function sayColor(){
alert(this.color);
}
sayColor();
var box={
color:'蓝色'
};
box.sayColor=sayColor;
box.sayColor();

----------------------------------------------------------------------------------
box.length: 打印出函数想要多少个属性

function box(name,age){
return name+age;
}
alert(box.length);

----------------------------------------------------------------------------------
apply

function box(num1,num2){
return num1+num2;
}
function sum(num1,num2){ //apply和call可以冒充另一个函数
return box.apply(this,[num1,num2]); //this表示window作用域,[]表示传递的参数
}
function sum2(num1,num2){
return box.apply(this,arguments); //这个可以当数组传递,arguments
}
alert(sum2(10,10));
----------------------------------------------------------------------------------
call

function box(num1,num2){
return num1+num2;
}

function sum(num1,num2){
return box.call(this,num1,num2); //call只是传递参数不同,其它和apply一样
}
alert(sum(10,10));

apply和call真正的用处:
var color='红色的';
var box={
color:'蓝色的'
}
function sayColor(){
alert(this.color);
}
//用call实现对象冒充,冒充box下,冒充window下
sayColor.call(window); //冒充window红色的
sayColor.call(this); //this就是window
sayColor.call(box); //作用域就在box对象里面,所以color就是蓝色的

使用call()或者apply()来扩充作用域的最大好处,就是对象不需要与方法发生任何耦合关系(耦合,就是互相关联的意思,扩展和维护会发生连锁反应)。也就是说,box对象和sayColor()方法之间不会有多余的关联操作,比如box.sayColor=sayColor

posted @ 2017-07-11 10:07  耿鑫  阅读(194)  评论(0编辑  收藏  举报