`
left.jessica
  • 浏览: 32862 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

javascript函数学习

阅读更多

1、关于嵌套函数

函数只可以在JS顶层代码中或嵌套在其他函数定义中,不可以出现在if或循环等其他语句中。从本质来说function并非一个语句,因为语句是动态的,是解释执行的。而函数定义是静态的,在代码被开始执行前,JS就会将函数解析并作为属性存储(如果是顶层函数则存于全局变量,嵌套函数则存入所嵌套的对象中)。

 

以上为关于犀牛书第五版P133-8.1.1的解释

 

2、可变长度的参数列表:Arguments对象

Arguments对象是一个类似数组的对象,可以按照数目获取传递给函数的参数值。Arguments对象也定义了callee属性,用来引用当前正在执行的函数。

函数内arguments标识符表示了Arguments对象,arguments.length表示了实际传递给函数的参数的个数,可以通过

arguments[0],arguments[1]....来调用参数。利用该特性,可以在函数定义时不指定参数个数,在函数内部通过arguments属性来获取参数,例如:

function max(){
  var m = Number.NEGATIVE_INFINITY;
  for(var i=0; i<arguments.length;i++){
    if(arguments[i]>m){
      m=arguments[i];
    }
  }
  return m;
}

// 调用
var largest = max(1, 10, 27, 100000, 8, 99, 80);

 当函数具有命名了的参数时,Arguments对象和命名了的参数不过是引用同一变量的两种不同方法,用参数名改变一个参数的值同时会改变通过arguments[]数组获取的值,反之亦然。

 

3、作为数据的函数

在JavaScript中函数还可以作为数据,这意味着能够把函数赋给变量,存储在对象的属性中或存储在数组的元素中,作为参数传递给函数等等。可以将定义了的函数赋值给其他变量或对象的属性,在这种情况下,函数成为方法。

 

4、作为方法的函数

函数可以赋值给对象的任何属性,例如:

 

o.m=f;
o.m();

 在方法体中,用来调用方法的对象成为关键字this的值,也就是说,当调用o.m()时,方法体可以使用this关键字来引用对象o。任何用作方法的函数都被有效地传递了一个隐式的参数,即调用函数的对象。

当一个函数作为函数而不是方法调用的时候,这个this关键字引用全局对象。

 

5、构造函数

构造函数是初始化一个对象的属性并且专门和new运算符一起使用的一个函数。

 

6、函数的属性和方法

每个函数都有一个prototype属性,它引用的是与定义的原型对象,原型对象在使用new运算符把函数作为构造函数时起作用。

方法apply()和call()

f.call(o, 1, 1);
//等价于
o.m=f;
o.m(1, 2);
delete o.m;

f.apply(o, [1,2]);

 

 

7、函数的作用域和闭包

先了解词法作用域,javascript中的函数是通过词法来划分作用域的,而不是动态地划分作用域的。这意味着,函数在定义它们的作用域里运行,而不是在执行他们的作用域里运行。

当js解释器调用一个函数,它首先将作用域设置为定义函数的时候起作用的那个作用域链,接下来,它在作用域的前面添加一个新的对象,这叫做调用对象。这个调用对象的一个属性被初始化成一个名叫 arguments 的属性,它引用了这个函数的 Arguments 对象,Arguments 对象是函数的实际参数。所有用 var 语句声明的本地变量也被定义在这个调用对象里。这个时候,调用对象处在作用域链的头部,本地变量、函数形式参数和 Arguments 对象全部都在这个函数的范围里了。当然,这个时候本地变量、函数形式参数和 Arguments 对象就覆盖了作用域链里同名的属性。

 

8、作为闭包的嵌入函数

javascript允许嵌入的函数,允许函数用作数据,并且使用词法作用域,这些因素互相交互,创造了惊人的和强大的效果。

当嵌入的函数在它们定义的同一个词法作用域里调用的时候,它们是很好理解的,并且不会有任何惊人之处,例如:

var x = "global";
function f(){
  var x = "local";
  function g(){alert(x);}
  g();//g在定义的词法作用域中被调用
}
f();// f也在定义的词法作用域中被调用

 

然而,在javascript中,函数和其他值一样,也是数据,因此,它们可以从函数返回,被赋给对象属性,存储在数组中,等等。除非涉及嵌入的函数,这也不会导致什么令人吃惊的事情,考虑如下代码,其中包含了一个函数,它返回一个嵌套的函数。

当定义了局部作用域的函数退出的时候,期待局部作用域能够种植并退出,也就是说,实际上这正是通常所发生的情况。当一个函数被调用的时候,就为它创建了一个调用对象并放置到作用域链中。当该函数退出的时候,调用对象也从作用域链中移除。当没有涉及到嵌套的函数的时候,作用域链是对调用对象的唯一引用,当对象从链中移除了,也就没有对它的引用了,最终通过对它的垃圾收集而完结。

但是嵌套函数改变了这一情景。如果创建了一个嵌套的函数,这个函数的定义引用了调用对象,因为调用对象在这个函数所定义的作用域链的顶端。可是如果嵌套函数只是在外围函数内部使用,那么对嵌套函数的唯一的引用在调用对象之中。当外围函数返回的时候,嵌套的函数引用了调用对象,并且调用对象引用了嵌套的函数,但是,没有其他的东西引用他们二者,因此,对这两个对象都可以进行垃圾收集了。

如果把对嵌套的函数的引用保存到一个全局的作用域中,情况又不相同了。使用嵌套的函数作用外围函数的返回值,或者把嵌套函数的函数存储为某个其他对象的属性来做到这一点,在这种情况下,有哦一个对嵌套的函数的外部引用,并且嵌套的函数将它的引用保留给外围函数的调用对象。结果是,外围函数的一次特定调用的调用对象亦然存在,函数的参数和局部变量的名字和值在这个对象中得以维持。javascript代码不会以任何方式直接访问调用对象,但是它所定义的属性是对嵌入函数任何调用的作用域链的一部分。js函数是将要执行的代码以及执行这些代码的作用域构成一个综合体,在计算机科学术语里,这种代码和作用域的综合体叫做闭包。

分享到:
评论

相关推荐

    JavaScript函数式编程.pdf

    不过,由于【标题】中提供了文档的名称——"JavaScript函数式编程.pdf",我可以根据这个名称扩展出关于JavaScript函数式编程的知识点。 JavaScript函数式编程的知识点非常丰富,涉及很多方面的内容,下面将详细介绍...

    javascript函数式编程

    对于已经熟悉Java的开发者来说,学习JavaScript函数式编程不仅可以拓宽视野,也有助于提升在前端开发领域的专业技能。阅读相关书籍,例如"javascript函数式编程",将帮助你更好地掌握这些概念并应用于实际项目中。

    整理Javascript函数学习笔记

    整理Javascript函数学习笔记显示了Javascript的模块化编程思想,将重复利用的代码封装成函数,便于代码的管理和维护。函数化是向编写高效、易读和可维护的代码迈进的重要一步。 以上知识点展示了Javascript函数的...

    javascript指南和函数式编程

    而《JavaScript函数式.zip》可能是一份关于JavaScript函数式编程的资料集合,函数式编程是一种编程范式,强调使用函数和避免改变状态。其中可能涵盖以下知识点: 1. **纯函数**:理解纯函数的定义,即给定相同的...

    JavaScript函数学习总结以及相关的编程习惯指南

    JavaScript函数学习总结以及相关的编程习惯指南 在JavaScript中,函数是一种强大的工具,它们不仅可以作为代码块执行,还可以作为值传递。在深入探讨函数之前,我们先来了解两个基础概念:`null` 和 `undefined`。 ...

    JavaScript函数式编程pdf

    通过阅读《JavaScript函数式编程》这本书,读者可以学习如何在实际项目中应用这些概念,提升代码质量,减少出错的可能性,并提高代码的可维护性。无论你是初学者还是经验丰富的开发者,这本书都值得一看,它能帮助你...

    学习javascript的函数

    学习javascript的函数

    javascript函数库查询手册

    JavaScript函数库是Web开发中不可或缺的部分,它们提供了一系列预先封装好的功能,可以帮助开发者高效地完成各种任务,如动画处理、事件处理、数据管理、Ajax通信等。本"JavaScript函数库查询手册"旨在为开发者提供...

    javascript函数式编程 underscore.js

    JavaScript函数式编程是一种编程范式,它强调使用函数来组织代码,将计算视为一系列惰性求值的操作。Underscore.js是一个轻量级的JavaScript实用库,它为开发者提供了大量函数式编程工具,使得在JavaScript中实践...

    javascript 函数式编程

    JavaScript 函数式编程是一种编程范式,它将函数视为第一类公民,允许它们作为其他函数的参数、返回结果,甚至...通过学习和实践函数式编程,开发者可以更好地驾驭JavaScript,写出更高效、更易于理解和维护的代码。

    javaScript函数式编程

    本书专门介绍JavaScript函数式编程的特性。 全书共9章,分别介绍了JavaScript函数式编程、一等函数与Applicative编程、变量的作用域和闭包、高阶函数、由函数构建函数、递归、纯度和不变性以及更改政策、基于流的...

    Javascript函数手册.rar

    总的来说,这个"Javascript函数手册.rar"是学习和查阅JavaScript函数知识的宝贵资源,涵盖了函数的基础到高级特性,对于初学者和经验丰富的开发者都有很高的参考价值。通过深入学习和实践手册中的内容,开发者可以更...

    Javascript函数帮助手册

    JavaScript函数帮助手册是一份详尽的资源,专为学习和理解JavaScript编程语言中的函数和时间对象函数而设计。这份手册不仅适用于初学者,也对有经验的开发者具有很高的参考价值。下面将详细介绍JavaScript函数和时间...

    JavaScript ES6函数式编程入门经典

    《JavaScriptES6函数式编程入门经典》使用JavaScriptES6带你学习函数式编程。你将学习柯里化、偏函数、高阶函数以及Monad等概念。  目前,编程语言已经将焦点从对象转移到函数。JavaScript支持函数式编程,并允许...

    JavaScript函数式编程----高清版.pdf

    JavaScript函数式编程----高清版.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!

    Javascript函数与对象

    ### JavaScript函数与对象详解 在JavaScript中,函数与对象是两个核心概念,它们构成了这门语言的基石。本文将深入探讨这两个主题,帮助读者更好地理解并掌握JavaScript。 #### 函数 函数是JavaScript中的第一类...

    一本关于JavaScript中函数式编程的书

    JavaScript中的函数式编程是一种强大的编程范式,它源自数学中的函数理论,强调将计算视为函数的求值,而不是状态的变化或指令的...学习和实践函数式编程,对于提升JavaScript开发者的技能和解决问题的能力至关重要。

    javascript函数详解!

    JavaScript函数详解 JavaScript是一种强大的、基于原型的、动态类型的脚本语言,广泛应用于网页和网络应用开发。在JavaScript中,函数扮演着核心角色,它们不仅可以作为可执行的代码块,还可以作为值进行传递和存储...

Global site tag (gtag.js) - Google Analytics