JavaScript基础函数的声明(014)
1.函数的重要地位
- 它们是一种特殊的对象
- 它们提供作用域
说函数在JavaScript里是特殊的对象,因为:
- 程序的执行时期可以动态创建函数对象;
- 函数对象可以赋给变量,通过变量可以再传递给其它变量,还可以被删除;
- 函数对象可作为其它函数的形参,也可以作为函数的返回值;
- 函数对象可以有自己的属性和方法(methods)。
例如,(实际编程中完全可以这样做)对于JavaScript的函数A来说,它是个对象;它有自己的属性和方法,这个方法又是个函数,叫函数B;函数B接受另一个函数C作为形参,当B执行完后,返回一个新的函数D。这就是JavaScript函数的强大和灵活之处。
函数还可以使用它的构造函数Function,被new出来(但我们不推荐这么做):
// antipattern
// for demo purposes only
var add = new Function('a, b', 'return a + b');
add(1, 2); // returns 3
在上面的代码中,add是个对象,因为它是new操作的结果;但它又是个函数,因为它可以通过传递形参,执行计算任务。
说函数可以提供作用域,这
也很重要。因为在JavaScript里,两个成对的花括号并不像C程序那样提供局部的作用域,而在JavaScript里,只有函数才能提供类似的功
能。例如,在函数内部用var声明的变量都是局部变量,对外不可以见,类似于Java里的private属性。而在全局的if或for循环的花括号里,用
var声明的变量都是全局变量。
2. 关于函数的术语
JavaScript的函数很强大,所以我们有必要对它的使用方法给出统一的术语。比如下面的代码展示了一个“有名函数表达式”(named)
function expression):
// named function expression
var add = function add(a, b) {
return a + b;
};
如果上面的代码里略去函数的名字add(也就是第二个add),就变成了一个“匿名函数表达式”( unnamed function expression),也称为“匿名函数”(anonymous function)。
// function expression, a.k.a. anonymous function
var add = function (a, b) {
return a + b;
};
上面的两个例子,可以统称为“函数表达式”,而“有名函数表达式”只是函数表达式的一种特殊情况,事实上,声明时略去了函数的名字并不影响函数的定义以及后续的调用执行。如果声明时没有略去函数的名字,我们可以通过add.name得到它的名字,这对于程序调试时可能会有用。
另外,还有一种叫“函数声明”,它和函数表达式非常类似:
function foo() {
// function body goes here
}
语法上,“函数声明”,和“函数表达式”都是函数的字面声明法(Literal),它们的语法区别只在于后面的分号,而在使用上的区别只有在实际的程序中才能体现出来。那我们应选择使用哪一种声明法呢?如果作为形参或是对象中的方法,那没得选,只能使用函数表达式了:
// this is a function expression
// pased as an argument to the function `callMe`
callMe(function () {
// I am an unnamed function expression
// also known as an anonymous function
}); // this is a named function expression
callMe(function me() {
// I am a named function expression
// and my name is "me"
}); // another function expression
var myobject = {
say: function () {
// I am a function expression
}
};
一个函数声明和函数表达式在使用上的区别是声明上提的现象。比如,当在一个函数A里面进行函数B声明,不管函数B声明在哪里,都可以在A内部的任意位置调用;类似的,当一个函数A里执行函数B的表达式,只有在表达式后面的代码才可以调用函数B。下面的例子说明了这个问题:
// antipattern
// for illustration only // global functions
function foo() {
alert('global foo');
}
function bar() {
alert('global bar');
} function hoistMe() {
console.log(typeof foo); // "function"
console.log(typeof bar); // "undefined" foo(); // "local foo"
bar(); // TypeError: bar is not a function // function declaration:
// variable 'foo' and its implementation both get hoisted
alert('local foo');
} // function expression:
// only variable 'bar' gets hoisted
// not the implementation
var bar = function () {
alert('local bar');
};
}
hoistMe();
3. 函数的name属性
如果是声明的是有名的函数,则可以使用函数对象的name属性:
function foo() {} // declaration
var bar = function () {}; // expression
var baz = function baz() {}; // named expression
foo.name; // "foo"
bar.name; // ""
baz.name; // "baz"
name属性在调试程序的时候使用,也可以在函数体内递归调用的时候使用。
JavaScript基础函数的声明(014)的更多相关文章
- JavaScript基础函数和词法分析以及常用的内置对象和使用方法(4)
day52 参考:https://www.cnblogs.com/liwenzhou/p/8004649.html 函数 函数定义 JavaScript中的函数和Python中的非常类似,只是定义方式 ...
- JavaScript基础函数---李老师的
<!DOCTYPE html><html><head> <title>demo2html</title> <meta ch ...
- Javascript基础 函数“重载”
Javascript不像其他编程语言一样具有函数签名(什么是函数签名,简单的说就是说函数的接受参数类型和参数个数,也有人认为返回类型也应该包括.具体概念大家可以到网上查询). 所以Javascript ...
- JavaScript基础函数的属性:记忆模式(019)
函数在Javascript里是有属性的,因为它们是一种特殊对象.事实上,就算是没有明确声明,函数在最初就已经包含了一些固有的属性,比如所有函数都length这个属性,它可以指出函数声明了多少个参数: ...
- JavaScript -基础- 函数与对象
一.JavaScript三对象 1.分类方式一 1)ECMAScript JavaScript的ECMA规范 JS本身的对象 2)Dom 操作HTML相关 3)BOM游览器对象 游览器窗口对象,全局的 ...
- Javascript基础——函数
一 函数的介绍 1.概念:由一堆代码按照一定的规则,组成实现了某个功能,通过函数自身或事件调用 函数的特点: 忽略细节:只关注其实现的功能,不关注内部构造: 重复使用:函数可以实现代码的重复利用: 选 ...
- JavaScript -基础- 函数与对象(二)String
一.判断数据类型typeof与判断对象类型instanceof 1.typeof typeof只能判断基础数据类型,无法判断引用数据类型 <script> var s="hell ...
- Javascript基础--函数(Function对象)
1.函数是一段可执行的代码,函数可多次调用,模块化管理. 2.使用function语句,function funName([arg1][,arg2]....[,argn]){代码块}.所有版本可用,一 ...
- JavaScript基础函数的配置对象Configuration Objects(020)
配置对象通常用在API库的实现中,当程序中需要编写要多次的模块,也可以采用这种模式.这种模式的好处是接口明确,扩展方便.比如,一个 addPerson在设计的最初需要两个参数作为初始化时人的姓名: f ...
随机推荐
- Spring Boot笔记(二) springboot 集成 SMTP 发送邮件
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 笔记:乘着项目迭代的间隙,把一些可复用的功能从项目中抽取出来,这是其中之一, 一.添加SMTP 及 MA ...
- MyBatis(三)动态SQL与缓存
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.动态SQL语句 准备工作: public class User { private int id; ...
- Java实现 蓝桥杯 算法提高 拿糖果
算法提高 拿糖果 时间限制:1.0s 内存限制:256.0MB 问题描述 妈妈给小B买了N块糖!但是她不允许小B直接吃掉. 假设当前有M块糖,小B每次可以拿P块糖,其中P是M的一个不大于根号下M的质因 ...
- Java实现 LeetCode 169 多数元素
169. 多数元素 给定一个大小为 n 的数组,找到其中的多数元素.多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输 ...
- Java实现 蓝桥杯VIP 算法提高 夺宝奇兵
算法提高 夺宝奇兵 时间限制:1.0s 内存限制:512.0MB [题目描述] 在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图: ...
- java实现第六届蓝桥杯打印大X
打印大X 打印大X 小明希望用星号拼凑,打印出一个大X,他要求能够控制笔画的宽度和整个字的高度. 为了便于比对空格,所有的空白位置都以句点符来代替. 要求输入两个整数m n,表示笔的宽度,X的高度.用 ...
- “造轮运动”之 ORM框架系列(三)~ 干货呈上
这一趴里面,我就来正式介绍一下CoffeeSQL的干货. 首先要给CoffeeSQL来个定位:最开始就是由于本人想要了解ORM框架内部的原理,所以就四处搜寻有关的博客与学习资料,就是在那个夏天 ...
- K8S-PV和PVC的实践
一.什么是PV和PVC? PV的全称是Persistent Volume,翻译过来为持久化存储卷,是对底层的共享存储的一种抽象,PV由管理员进行创建和配置,主要含存储能力.访问模式.存储类型.回收策略 ...
- python3 后台维护软件
后台维护软件 一.思路: 登录: 1.用户登录(编写GUI用户登录界面) 使用模块:tkinter,pymssql 验证逻辑: 1.获取文本框输入数据. 2.进行空值值判断 if ...else... ...
- 通过SecureCRT向远程Linux主机上传和下载文件
有时候直接在Linux服务器上通过 wget 或 curl 工具下截比较大的网络文件时会比较慢,这时我们通常会改用在Windows平台通过迅雷等更加现代化的下载功具下好目标文件(迅雷开会员才能更高速的 ...