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属性降低了函数的耦合、

 

  ECMAScript 5 也规范了另一个函数属性:caller。保存着调用当前的函数的函数的引用,如果是在全局作用域则为null。

function outer(){
    inner();
}

function inner(){
    alert(inner.caller);
}

outer();

//alert函数会制动执行toString函数,这里弹出outer函数代码

  每个函数都有两个非继承而来的方法:apply() 和 call():用途是在特定的作用域中调用函数,等于设置函数体内的this对象的值。

apply()方法接受两个参数,一个是在其中运行函数的作用域,另一个是参数数组。第二个参数可以是Array()的实例,也可以是arguments对象。

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

function callSum(num1, num2){
    return sum.apply(this, arguments)
}
callSum(1, 2);     //全局作用域中调用所以this为window。

call()方法接受两个参数,与apply区别是第二个参数,必须逐个举列出来。
function callSum(num1, num2){
    return sum.call(this, num1, num2);
}

callSum(10, 10);

ECMAScript定义了bind方法,简历函数实例,其this值会被绑定到传给bind()函数的值,例如:

var obj = {    this.color: "red"};

window.color = "green";

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

var newFunc = sayColor.bind(obj);newFunc();        //red
时间: 2024-10-14 20:58:34

Javascript高级程序设计——函数内部属性与函数属性的相关文章

Javascript高级程序设计——this、闭包、函数表达式

在javascript中函数声明会被提升,而函数表达式不会被提升.当函数执行时,会创建一个执行环境和相应的作用域链,然后利用arguments和其他的命名参数的值来初始化函数的活动对象,作用域链链中所有的外部活动对象都处于第二的位置. function compare(num1, num2){ if(num1 < num2){ retunr -1; } else if(num1 = num2){ retunr 0; } else(num1 > num2){ retunr 1; } } var

JavaScript高级程序设计7学习笔记之函数表达式

函数表达式是JavaScript中的一个既强大有容易令人困惑的特性 定义函数的方式有两种,一种是函数声明,另一种就是函数表达式 关于函数声明,它的一个重要特征就是函数声明提升,意思是在执行代码前会读取函数声明,这就意味着可以把函数声明放在调用它的语句后面 sayHi(); function sayHi(){alert("hi");} 第二种创建函数的方式是使用函数表达式,函数表达式有几种不同的语法形式 最常见的一种方式是 var functionName = function(arg0

Javascript高级程序设计——第三章:函数

函数Function 通过函数封装多条语句,在任何地方执行.javascript函数不会重载,相同名字函数,名字属于后定义的函数通过function关键词声明. function functionName(arguments){ statement; } 函数会在执行return语句后停止并退出.return语句之后的任何代码不会被执行. function say(){ return “hay”; alert("hay"); //永远不执行 } return后不带返回值的会返回unde

JavaScript高级程序设计:第七章 - 函数

六.函数表达式 //把函数当成值来使用的情况下,都可以使用匿名函数 递归 //递归函数是在一个函数通过名字调用自身的情况下构成的 //使用函数声明来定义递归函数可能会出现问题 //这是一个经典的递归阶乘函数 function factorial(num) { if (num<1){ return 1; }else{ return num * factorial(num-1); } } //使用函数声名来定义该递归函数时,函数名和函数体会产生耦合. //当其他指针指向该函数体的时候,由于执行ano

JavaScript高级程序设计之函数

函数实际上是对象,每个函数都是Function类型的实例. 函数是引用类型. 函数名实际上是一个指向函数对象的指针,不会与某个函数绑定. // 这种写法更能表达函数的本质 var sum = function(num1, num2) { return num1 + num2; }; var anotherSum = sum; sum = null; console.log(anotherSum(10, 20)); // 30 console.log(sum(10, 20)); // typeer

JavaScript高级程序设计之函数性能

setTimeout 比 setInterval 性能更好 // 取代setInterval setTimeout(function self () { // code goes here setTimeout(self, interval); }, interval); 对异步执行的大数组的分割执行 // 大块.异步数组的处理 function chunk(arr, process, context) { setTimeout(function self() { var item = arr.

JavaScript高级 函数表达式 《JavaScript高级程序设计(第三版)》

函数表达式的特征 使用函数实现递归 使用闭包定义私有变量 前面我们说到定义函数有两种方式:函数声明.函数表达式. 两者的区别在于函数声明提升,前者在执行之前的上下文环境中直接被赋值,而后者不会. 一.递归 递归函数是一个函数通过名字调用自身的情况下构成的. function factorial(num){ if(num<1){ return 1; }else{ return num * arguments.callee(num-1); } } alert(factorial(10)); 二.闭包

《Javascript高级程序设计》阅读记录(二):第四章

这个系列之前文字地址:http://www.cnblogs.com/qixinbo/p/6984374.html 这个系列,我会把阅读<Javascript高级程序设计>之后,感觉讲的比较深入,而且实际使用价值较大的内容记录下来,并且注释上我的一些想法.做这个一方面是提升了我的阅读效果以及方便我以后阅读 另一个目的是,Javascript高级程序设计这本书内容很多也很厚,希望其他没有时间的人可以通过看这系列摘录,就可以大体学到书里面的核心内容. 绿色背景的内容是我认为比较值得注意的原著内容.

javascript高级程序设计 第十三章--事件

javascript高级程序设计 第十三章--事件js与HTML的交互就是通过事件实现的,事件就是文档或浏览器窗口中发生的一些特定的交互瞬间. 事件流:事件流描述的是从页面中接收事件的顺序,IE的是事件冒泡流,Netscape的是事件捕获流,这个两个是完全相反的事件流概念. 事件冒泡:由最具体的元素接收,然后逐级向上传播到更高级的节点,即事件沿DOM树向上传播,直到document对象. 事件捕获:不大具体的节点应该更早接收到事件,相当于沿DOM节点树向下级传播直到事件的实际目标,在浏览器中,是

《JavaScript高级程序设计》学习笔记(5)——面向对象编程

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第六章内容. 1.面向对象(Object-Oriented, OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.前面提到过,ECMAScript中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同. ECMA-262把对象定义为:"无序属性的集合,其属性可以包含基本值.对象或者函数.