函数深入理解---函数的内部属性arguments和this

arguments

function say(num){
    /*
        在函数对象中有一个属性叫做arguments,通过这个属性可以获取相应的参数值,这个属性
        是一个数组,其实就是传递进来的参数
    */
    console.log(arguments.length);
    for(var i=0;i<arguments.length;i++){
        console.log(arguments[i]);
    }
    console.log(num);
}
/*
    在arguments这个对象中有一个callee的方法,arguments.callee(arg)
    可以反向的调用
*/

//say(1,2,3);

//此时和函数名耦合在一起
//return num * factorial(num-1);
//以下就实现了函数名的解耦合,在js中通常都是使用这种方式做递归
function factorial(num){
    if(num<=1){
        return 1;
    }else{
        return num*arguments.callee(num-1);
    }
}

/*
    以上是一个求阶乘的函数,以上递归调用的函数名称和原有函数名耦合在一起了
    如果将来这个函数名称更改之后递归调用就会失效
*/
var cf = factorial;
//此时不会报错
console.log(cf(5));
factorial = null;

//此时由于cf这个函数依然使用factorial这个名称来调用,但是factorial已经指向null了,所以就会报错
//递归调用就会失效

console.log(cf(5));

this

/*
当需要创建一个类的时候,设置类的属性和方法需要通过this关键字来引用
但是特别注意:this关键字在调用时会根据不同的调和对象变得不同
*/

var color = ‘red‘;
function showColor(){
    console.log(this.color);
}

//创建了一个类,有一个color的属性和一个show的方法

function Circle(color){
    this.color = color;
    this.showColor = showColor;
}

var c = new Circle(‘yellow‘);
//使用c来调用showColor 方法,等于调用了showColor()方法
//此时的this是c,所以color就是yellow
c.showColor();//yellow
//此时调用的对象等于是window,showColor的this就是window,所以就会找window中color
showColor(); //red
时间: 2024-11-12 02:21:57

函数深入理解---函数的内部属性arguments和this的相关文章

js函数的内部属性---arguments,callee,caller

在接下来的几篇文章中,我大家谈谈函数的内部属性,arguments,callee,caller (1)arguments,是一个类数组对象,其中包含了传入函数的所有参数,主要用途是,保存函数的参数: 代码1: function aa(b){alert(arguments);} aa(4); function aa(a,b,c,d){alert(arguments.length);} aa(1,2,3,4); function aa(a,b,c,d){alert(arguments[2]);} a

2、函数内部属性 arguments是类数组对象,主要用途是保存函数参数,但这个对象中有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数

例如:(1).function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } }//此时是递归算法 var trueFactorial=factorial;//将factorial复制给trueFactorial factorial=function(){ return 0; }//覆盖factorial函数 alert(trueFactorial(5));//0;因为辞职factorial

js 方法中内部属性arguments的callee属性

var factorial=function(num){ if(num<=1) return 1; else // return num*factorial(num-1);//递归时,在方法内部通过该方法的方法名来调用自己是非常危险的,因为js可以直接修改方法变脸的值 return num*arguments.callee(num-1);//递归时,应该使用方法内部属性arguments的callee属性,它保存了当前方法的地址(指针) } var another=factorial; fact

函数深入理解---函数的属性length和方法call 和apply

函数同样有两个非常好用的属性:length 和prototype function fn1(){ } function fn2(num1,num2){ } function fn3(num1){ } //函数的length就表示该函数所期望的参数值 alert(fn1.length) // 0 alert(fn2.length) // 2 alert(fn3.length) // 1 call 和apply方法查可以通过函数名称来调用函数 对于apply而言 有两个参数,第一个是调用的上下文,第

函数深入理解---函数的值传递

函数的值传递 //由于函数是对象,所以可以直接把函数参数传递进来 function callFun(fun,arg){ //第一个参数就是函数对象 return fun(arg); } function sum(num){ return num +100; } function say(str){ console.log('hi' + str); } //var say = x; //调用了say函数 callFun(say,'leo'); //调用了sum函数 console.log(call

函数深入理解---函数的定义方式

函数的定义方式 //第一种定义方式 function fn1(){ alert('fn1'); } /*函数就是一个非常特殊的对象,是一个Function类的实例, 其实在内存中存储的操作是通过一个键值对来存储的 */ console.log(typeof fn1); //由于函数是一个对象,所以可以通过如下方式定义 //以下是通过函数的拷贝来完成赋值,两个引用并没有指向同一个对象 var fn2 = fn1; //两个的值虽然相等,但是指向的是不同的空间 fn2(); fn1 = functi

Makefile函数eval理解

Makefile函数eval理解 函数"eval"是一个比较特殊的函数.使用它我们可以在我们的Makefile中构造一个可变的规则结构关系(依赖关系链),其中可以使用其它变量和函数.函数"eval"对它的参数进行展开,展开的结果作为Makefile的一部分,make可以对展开内容进行语法解析.展开的结果可以包含一个新变量.目标.隐含规则或者是明确规则等.也就是说此函数的功能主要是:根据其参数的关系.结构,对它们进行替换展开. 函数"eval"的返

变量声明置顶规则、函数声明及函数表达式和函数的arguments属性初始化

一.变量声明和变量赋值: if (!("a" in window)) { var a = 1; } alert(a);//a为? 你可能认为alert出来的结果是1,然后实际结果是"undefined".要了解为什么,我们需要知道JavaScript里的3个概念: 1.所有的全局变量都是window的属性,语句 var a = 1;等价于window.a = 1; 可以用如下方式来检测全局变量是否声明: "变量名称" in window 2.声明

Javascript高级程序设计——函数内部属性与函数属性

函数内部属性 函数内部有两个特殊的属性arguments和this.其中,arguments是类数组对象,包含传入函数中的所有值,这个arguments还有一个属性:callee,这个属性是一个指针,指向拥有arguments的函数.而this据以引用的是函数执行环境对象. function fib(n){ if(n = 1){ return 1; }else{ return n * arguments.callee(n - 1); } } //这里利用函数内arguments的callees属