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

函数表达式是JavaScript中的一个既强大有容易令人困惑的特性 定义函数的方式有两种,一种是函数声明,另一种就是函数表达式

关于函数声明,它的一个重要特征就是函数声明提升,意思是在执行代码前会读取函数声明,这就意味着可以把函数声明放在调用它的语句后面

sayHi();
function sayHi(){alert("hi");}

第二种创建函数的方式是使用函数表达式,函数表达式有几种不同的语法形式

最常见的一种方式是

var functionName = function(arg0,arg1,arg2){
//函数体
};

理解函数提升的关键,就是理解函数声明与函数表达式之间的区别 例如 执行以下代码的结果可能会让人意想不到

if(conditon){
function sayHi(){alert("yes");}
else
 function sayHi(){alert("no");}
}

大多数情况下,浏览器会返回第二个申明,忽略condition

闭包

不少开发人员搞不清匿名函数和闭包的概念 闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见方式,就是在一个函数内部创建另外一个函数

私有变量:严格来讲JavaScript中没有私有成员的概念;所有对象属性都是公有的,不过倒是有一个私有变量的概念,任何在函数中定义的变量,都可以认为是私有变量,因为不能再函数的外部访问这些变量,私有变量包括函数的参数,局部变量和在函数内部定义的其他函数

function add(num1,num2){
var sum = num1 + num2;

return sum;
}

在这个函数内部,有三个私有变量,num1,num2,sum 在函数内部可以方位这几个变量,但在函数外部则不能访问他们,如果在这个函数内部创建一个闭包,那么闭包通过自己的作用域链也可以访问这些变量,而利用这一点,就可以创建用于访问私有变量的公有方法

我们把有权访问私有变量和私有函数的公有方法称为特权方法,有两种在对象上创建特权的方式,第一种是在构造函数中定义特权方法,基本模式如下

function Person(name){
 this.getName = function(){return name;};
 this.setName = function(value){name = value;};
}

var person = new Person("niko");
alert(person.name);//
person.setName("gred");
alert(person.name);

以上代码定义了两个特权方法,这两个方法都可以再构造函数外部使用

静态私有变量 通过在私有作用域中定义私有变量或者函数,同样可以创建创建特权方法

(function(){
var privateViarable = 10;//私有变量和私有函数
function privateFunction(){return false;}
MyObject = function(){};//构造函数
MyObject.prototype.publiceMethod = function(){privateViarable++;return privateFunction();};

})();

模块模式:前面的模式是用于为自定义类型创建私有变量和特权方法的而道格拉斯所说的模块模式则是为单例创建私有变量和特权方法,所谓单例,指的就是只有一个实例的对象,按照惯例,JavaScript是以对象字面量的方式来创建单例对象的

var singleton = {
name: value;
method : function(){
//这里是代码的方法
}
};
var singleton = function(){
    var privateVariable = 10;
    function privateFunction(){return false;}
    //特权,公有方法和属性
    return{publicProperty : true,
             publicMethod : function(){privateVariable++;return privateFunction();}};    

};();

  

 

时间: 2025-01-04 15:24:25

JavaScript高级程序设计7学习笔记之函数表达式的相关文章

《JavaScript高级程序设计》学习笔记12篇

写在前面: 这12篇博文不是给人看的,而是用来查的,忘记了什么基础知识,点开页面Ctrl + F关键字就好了 P.S.如果在对应分类里没有找到,麻烦告诉我,以便尽快添上.当然,我也会时不时地添点遗漏的东西进去 目录 JS学习笔记1_基础与常识 JS学习笔记2_面向对象 JS学习笔记3_函数表达式 JS学习笔记4_BOM JS学习笔记5_DOM JS学习笔记6_事件 JS学习笔记7_表单脚本 JS学习笔记8_错误处理 JS学习笔记9_JSON JS学习笔记10_Ajax JS学习笔记11_高级技巧

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

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

1 《JavaScript高级程序设计》学习笔记(1)

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 首先,我将从<JavaScript高级程序设计>这本JavaScript学习者必看的经典教程开始,JavaScript的很多语法规则及习惯用法和Java极其相似,因此对于有Java基础的学习者来说,JS是很容易上手的.该系列的每次更新将对应原书的一章内容,本次更新对应原书的第三章,主要是一些基本概念,内容很简单, 知识点也较少. 1.和一般的编程语言一样,标识符可以由字母.数字.下划线和美元符组成

《JavaScript高级程序设计》学习笔记(4)——引用类型

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第五章内容. 在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起,通常也被称为类,有时候也被成为对象定义,因为他们描述的是一类对象所具有的属性和方法.对象是某个特定引用类型的实例,新对象是使用new操作符后跟一个构造函数来创建的, var person = new Object() ; 创建了一个object对象.构造函数

《JavaScript高级程序设计》学习笔记 基本概念

系统学习JS, 从<JavaScript高级程序设计>入门,通过学习jQuery或者angularJS源码来进阶. 第1章 JavaScript简介 1.JS问世的目的是处理以前由服务器端语言(如Perl)负责的一些输入验证操作,由Netscape主导开发,那时候微软的IE还不能独领风骚.最初叫做LiveScript,当时媒体热炒Java,于是改名为JavaScript.JavaScript和ECMAScript通常指同一门语言,但是,JavaScript是ECMA-262标准的实现和扩展.E

JavaScript高级程序设计3学习笔记

引用类型有Object.Array.Date.RegExp.Function.基本包装类型 创建一个对象实例用new + 构造函数,比如:var obj = new Object(); Object类型 还可以用对象字面量表示法来表示对象: var person = { name : "harry", age : 29 }; 访问对象的属性(或使用对象的方法来操作数)使用点表示法或者方括号(适用于属性表示法),例如 alert(person["name"]); //

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高级程序设计6学习笔记之面向对象程序设计

首先 JavaScript是没有类这个概念的 ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值,对象或者函数” 创建对象的方法: var person = new Object(); person.name = "niko"; person.age = 20; person.say = function(){alert(this.name);}; 上面的例子用对象字面量语法可以写为: var Person = { name : "niko"; a

《JavaScript高级程序设计》学习笔记(2)--JS运算符详解

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 思维导图 前面对JS的运算符的操作很多细节的东西没有提及,今天给大家分享一张网上找的思维导图,对这一部分做一个详细的补充,小编觉得总结得还算很到位的: