JavaScript学习笔记04-函数

转载 2016年05月30日 21:11:39

avaScript 函数定义


JavaScript 使用关键字 function 定义函数。

函数可以通过声明定义,也可以是一个表达式。


函数声明

在之前的教程中,你已经了解了函数声明的语法 :

function functionName(parameters) {
  执行的代码
}

函数声明后不会立即执行,会在我们需要的时候调用到。

实例

function myFunction(a, b) {
    return a * b;
}

函数表达式

JavaScript 函数可以通过一个表达式定义。

函数表达式可以存储在变量中:

实例

var x = function (a, b) {return a * b};

尝试一下 »

在函数表达式存储在变量后,变量也可作为一个函数使用:

实例

var x = function (a, b) {return a * b};
var z = x(4, 3);

Function() 构造函数

在以上实例中,我们了解到函数通过关键字 function 定义。

函数同样可以通过内置的 JavaScript 函数构造器(Function())定义。

实例

var myFunction = new Function("a", "b", "return a * b");

var x = myFunction(4, 3);

尝试一下 »

实际上,你不必使用构造函数。上面实例可以写成:

实例

var myFunction = function (a, b) {return a * b}

var x = myFunction(4, 3);

Note 在 JavaScript 中,很多时候,你需要避免使用 new 关键字。

函数是对象

在 JavaScript 中使用 typeof 操作符判断函数类型将返回 "function" 。

但是JavaScript 函数描述为一个对象更加准确。

JavaScript 函数有 属性 和 方法

函数显式参数与隐藏参数(arguments)

在先前的教程中,我们已经学习了函数的显式参数:

functionName(parameter1, parameter2, parameter3) {
    code to be executed
}

函数显式参数在函数定义时列出。

函数隐藏参数(arguments)在函数调用时传递给函数真正的值。


参数规则

JavaScript 函数定义时参数没有指定数据类型。

JavaScript 函数对隐藏参数(arguments)没有进行检测。

JavaScript 函数对隐藏参数(arguments)的个数没有进行检测。


默认参数

如果函数在调用时缺少参数,参数会默认设置为: undefined

有时这是可以接受的,但是建议最好为参数设置一个默认值

JavaScript 函数调用


JavaScript 函数有 4 种调用方式。

每种方式的不同方式在于 this 的初始化。


this 关键字

一般而言,在Javascript中,this指向函数执行时的当前对象。

Note 注意 this 是保留关键字,你不能修改 this 的值。


全局对象

当函数没有被自身的对象调用时, this 的值就会变成全局对象。

在 web 浏览器中全局对象是浏览器窗口(window 对象)。

该实例返回 this 的值是 window 对象:

实例

function myFunction() {
    return this;
}
myFunction();                // 返回 window 对象

尝试一下 »

Note 函数作为全局对象调用,会使 this 的值成为全局对象。
使用 window 对象作为一个变量容易造成程序崩溃。

函数作为方法调用

在 JavaScript 中你可以将函数定义为对象的方法。

以下实例创建了一个对象 (myObject), 对象有两个属性 (firstName 和 lastName), 及一个方法 (fullName):

实例

var myObject = {
    firstName:"John",
    lastName: "Doe",
    fullName: function () {
        return this.firstName + " " + this.lastName;
    }
}
myObject.fullName();         // 返回 "John Doe"

尝试一下 »

fullName 方法是一个函数。函数属于对象。 myObject 是函数的所有者。

this对象,拥有 JavaScript 代码。实例中 this 的值为 myObject 对象。

测试以下!修改 fullName 方法并返回 this 值:

实例

var myObject = {
    firstName:"John",
    lastName: "Doe",
    fullName: function () {
        return this;
    }
}
myObject.fullName();          // 返回 [object Object] (所有者对象)

尝试一下 »

Note 函数作为对象方法调用,会使得 this 的值成为对象本身。

使用构造函数调用函数

如果函数调用前使用了 new 关键字, 则是调用了构造函数。

这看起来就像创建了新的函数,但实际上 JavaScript 函数是重新创建的对象:

实例

// 构造函数:
function myFunction(arg1, arg2) {
    this.firstName = arg1;
    this.lastName  = arg2;
}

// This creates a new object
var x = new myFunction("John","Doe");
x.firstName;                             // 返回 "John"

尝试一下 »

构造函数的调用会创建一个新的对象。新对象会继承构造函数的属性和方法。

Note 构造函数中 this 关键字没有任何的值。
this 的值在函数调用时实例化对象(new object)时创建。

作为函数方法调用函数

在 JavaScript 中, 函数是对象。JavaScript 函数有它的属性和方法。

call() 和 apply() 是预定义的函数方法。 两个方法可用于调用函数,两个方法的第一个参数必须是对象本身。

实例

function myFunction(a, b) {
    return a * b;
}
myFunction.call(myObject, 10, 2);      // 返回 20

实例

function myFunction(a, b) {
    return a * b;
}
myArray = [10,2];
myFunction.apply(myObject, myArray);   // 返回 20

两个方法都使用了对象本身作为第一个参数。 两者的区别在于第二个参数: apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。

在 JavaScript 严格模式(strict mode)下, 在调用函数时第一个参数会成为 this 的值, 即使该参数不是一个对象。

在 JavaScript 非严格模式(non-strict mode)下, 如果第一个参数的值是 null 或 undefined, 它将使用全局对象替代。

Note 通过 call() 或 apply() 方法你可以设置 this 的值, 且作为已存在对象的新方法调用。














javascript基础学习笔记

编者寄言:  本文主要为编者读书笔记,在文章里面很多话是掺杂了编者自己的见解,如果有哪里出现错误或者用词不严谨,请友善留言,编者会及时去更改。 本文很多地方只是简单说了一下应该注意的地方,具体代码部分...
  • u012967849
  • u012967849
  • 2016年07月20日 14:08
  • 1953

javascript学习笔记

第一章 一、JavaScript概述 JavaScript是基于对象和事件驱动的脚本语言,主要应用在客户端。 特点: 1.交互性(它可以做的就是信息的动态交互) 2.安全性(它不允许直接访问本地硬盘...
  • zhoulenihao
  • zhoulenihao
  • 2013年09月04日 23:04
  • 4096

js学习笔记(比较全)

什么是JavaScript? 1. JavaScript 是一种客户端脚本语言(脚本语言是一种轻量级的编程语言)。 2. JavaScript 通常被直接嵌入 HTML 页面。 3....
  • jiangzhongwei_
  • jiangzhongwei_
  • 2016年07月22日 20:12
  • 601

JavaScript for Kids 学习笔记1. 学习环境

第一章讲了一堆废话。不过,确实也有干货,那就是学习环境。学习过程中必须要有一个简单易用的练习平台,就像Swift的Playground。...
  • wershest
  • wershest
  • 2017年03月10日 12:24
  • 439

HTML5学习笔记 —— JavaScript基础知识

来源于我的HTML5学习笔记,通过它可以快速入门HTML5,同时可以作为工作中快速查找知识点的利器。 本文由浅入深地详解了JavaScript的各项基础知识点,通过本文你将会对JavaScript语...
  • chencl1986
  • chencl1986
  • 2017年05月11日 21:51
  • 2536

Javascript设计模式-04-工厂模式

Javascript设计模式 - 04 -工厂模式(简单工厂,抽象工厂)简介 工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类,该模式使一个类的实例化延迟到了子类,而子类可以重...
  • mjzhang1993
  • mjzhang1993
  • 2017年07月13日 09:39
  • 194

前端无小事之HTML--LocalStorage

参考书籍:《JavaScript 权威指南----ECMAScript5+HTML5DOM+HTML5BOM》编著:张亚飞 1.什么是Web存储? Web存储机制是一种通过字符串形式的 k...
  • pengjunlee
  • pengjunlee
  • 2016年11月06日 10:34
  • 10837

04-树7 二叉搜索树的操作集

04-树7 二叉搜索树的操作集本题要求实现给定二叉搜索树的5种常用操作。函数接口定义:BinTree Insert( BinTree BST, ElementType X ); BinTree Del...
  • codeforcer
  • codeforcer
  • 2016年10月18日 20:52
  • 1006

【C语言】04-函数

本文目录 一、函数的分类二、函数的声明和定义三、函数的形参和实参 说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。如果你还没有...
  • u010040590
  • u010040590
  • 2013年11月22日 19:22
  • 628

《JavaScript高级程序设计 第三版》学习笔记 (十一)事件详解

一、事件流 1.事件冒泡:事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)。最早使用事件冒泡的是IE,现在绝大多数浏览器都使用冒泡。IE9、F...
  • lbxx1984
  • lbxx1984
  • 2014年09月01日 21:55
  • 1416
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JavaScript学习笔记04-函数
举报原因:
原因补充:

(最多只允许输入30个字)