第七章 函数表达式和函数声明,关于this对象 ,私有作用域(function(){})() ,私有变量和特权方法
一:函数表达式和函数声明
1:函数声明和函数表达式的区别
①函数声明不需要分号结尾
②函数声明有函数提升的特点
③函数声明后面不能跟圆括号直接调用,因为javascript将function关键字当作一个函数声明的开始,而函数声明后面不能跟圆括号!
2:匿名函数的作用
①作为值使用
function sum(num1,num2){
return function(num1,num2){
return num1+num2;
}
}
3:闭包
概念:是指有权访问另一个函数作用域中的变量的函数。(通过在一个函数内部创建另一个函数得到闭包)
①当一个函数被调用时,会创建一个执行环境和相应的作用域链,使用arguments和其他命名参数的值来初始化函数的活动对象。外部函数的活动对象在作用域链中处于次位。
②
function compare(value1,value2){
if(value<value2){
return -1;
} else if(value1>value2){
return 1;
} else {
return 0;
}
}
//调用compare()时,会创建一个包含arguments,value1和value2的活动对象。全局执行环境的变量对象(包括result和compare)在compare()执行环境的作用域链中处于第二位。
③后台的每个执行环境中都有一个变量对象。全局对象一直存在,像compare()函数这样的局部环境的变量对象,则只在函数执行的过程中存在。
作用域链本质上事一个指向变量对象的指针列表,它只引用但不实际包含变量对象。
④而闭包———在create()函数内部定义的匿名函数的作用域链中,实际上将会包含外部函数create()的活动对象。
var create1 = create("name");
var result = carete1({name:"Wang"},{name:"Lee"});
//函数create中有匿名函数
在函数create执行完之后,因为匿名函数的作用域链依旧在引用这个活动对象,所以它的活动对象不会被销毁。(但create()执行完后create()的作用域链被销毁)
通过
create1 = null;
销毁匿名函数的作用域链。
二.关于this对象(易出错)
1:匿名函数的执行环境具有全局性,因此this对象通常指向window。但是由于闭包的写法因此并不明显
var name = "global";
var object = {
name : "part",
getName : function(){
return function(){
return this.name;
}
}
};
alert(object.getName()());
//global
2:每个函数在被调用的时候会自动取得两个特殊变量:this和arguements。内部函数在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不会直接访问外部函数中的这两个变量。
需要把this保存在变量中才能让闭包访问到。
var name = "The Window";
var object = {
name : "My object",
getName : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getName()());
//My object
三.私有作用域
用作私有作用域(块级作用域)的语法如下:
(function(){
//这里是块级作用域
})();
这种技术经常在全局作用域中用在函数外部,从而限制向全局作用域中添加过多的变量和函数。比如
(function(){
var now = new Date();
if(now.getMonth()==0&&now.getDate()==1){
alert("Happy");
}
})();
//这段代码在1月1日的时候显示祝贺新年的消息
四.私有变量和特权方法
①私有变量:在函数内部定义的变量
②特权方法:有权访问私有变量和私有函数的公有方法称为特权方法(利用闭包实现)
function PP(name) {
this.getName : function(){
return name;
}
}
var ppp = new PP("hehe");
alert(ppp.getName());
③通过getName()方法访问私有变量name,但是这种写法有个缺点:必需使用构造函数模式来完成。——其他创建私有变量和特权方法的模式见书,暂时不深入
第七章 函数表达式和函数声明,关于this对象 ,私有作用域(function(){})() ,私有变量和特权方法的更多相关文章
- js函数表达式和函数声明的区别
我们已经知道,在任意代码片段外部添加包装函数,可以将内部的变量和函数定义"隐 藏"起来,外部作用域无法访问包装函数内部的任何内容. 例如: var a = 2; function ...
- js基础:函数表达式和函数声明
函数表达式和函数声明的区别.实际上,解析器在向执行环境中加载数据是,对函数表达式和函数声明并非一视同仁.解析器会率先读取函数声明,并使其在执行任何代码之前可用.而函数表达式,则必须等到解析器执行到它所 ...
- js中 函数声明/函数表达式/匿名函数/箭头函数/立即执行函数
函数声明: function add(a, b) { // ... } 1.顾名思义,声明一个函数, 用关键字 “function” 来告诉,这是一个函数. 2.任何地方,想用就可以拿过来使用 函数表 ...
- JS中函数表达式与函数声明的区别
hello,沐晴又来更新啦,今天呢,跟大家讲讲让人头疼的函数表达式和函数声明,反正我当初看那本高级程序的时候,是没怎么看太透,哈哈.我是个比较重基础的人,跟我一起探讨函数表达式和函数声明的世界吧. 首 ...
- 变量声明置顶规则、函数声明及函数表达式和函数的arguments属性初始化
一.变量声明和变量赋值: if (!("a" in window)) { ; } alert(a);//a为? 你可能认为alert出来的结果是1,然后实际结果是“undefine ...
- JavaScript函数表达式与函数声明
什么是函数? 函数是事件驱动或者被调用时执行的重复代码块. 作用域: 1. 全局作用域 2. 函数作用域(局部作用域) var i = 100; //全局作用域 function fun(){ var ...
- javascript笔记05:函数表达式和函数语句的区别
1.首先是函数语句: myfunc(); function myfunc() { //执行一些语句 } 当函数语句被定义的时候,在一个脚本代码被优先考虑,因此,无论该函数是定义之前或者定义之后都可以被 ...
- 第七章 python基础之函数,递归,内置函数
五 局部变量和全局变量 name='cyj' #在程序的一开始定义的变量称为全局变量. def change_name(): global name #global 定义修改全局变量. name=&q ...
- JAVASCRIPT高程笔记-------第 七章 函数表达式
7.1递归 经典递归例子 function factorial(num){ if(num <= 1){ return 1; }else{ return num * factorial(num - ...
随机推荐
- 使用Android Studio手把手教你将应用打包+代码混淆
最近几天用Google的Design库写了个App,使用Android Studio将app打包时遇到的几个瓶颈,所以把详细步骤写入下来. AS中怎么获取应用签名 这和eclipse不同,eclips ...
- ActiveMQ系列之一:ActiveMQ简介
ActiveMQ是什么 ActiveMQ是Apache推出的,一款开源的,完全支持JMS1.1和J2EE 1.4规范的JMS Provider实现的消息中间件 (Message Oriented ...
- 【Nginx】下载,请求限速,根据URL参数限速
这个场景是限制单个连接的下载速度,还有限制单个IP的连接数,或者单位时间内的请求数,实验环境 nginx1.9.x. 小例子为主,具体的细节请多看文档. 限制下载速度 location /downlo ...
- IOS使用FMDB封装的数据库增删改查操作
// // DBHelper.h // LessonStoryBoard // // Created by 袁冬冬 on 15/10/29. // Copyright (c) 2015年 袁冬 ...
- 2018年,请不要再使用OLE生成EXCEL文件
输出EXCEL文件是ABAP开发工作中的常见需求,为了学习相关技术,我翻译过一篇文章:使用OLE2对象创建EXCEL文件,并且一度乐在其中. 最近几个月,经过与若干EXCEL打印程序的艰苦斗争,以及对 ...
- linux系统安装mysql数据库
1.首先关闭linux的防火墙,执行命令 chkconfig iptables off 2.从mysql官网上下载自己适合的mysql版本https://dev.mysql.com/downloads ...
- PLSQL 创建自定义函数注意事项
2017-6-8周四,今天遇到的需求是,从数据库中查找出某张表的某些数据,并将这些数据做简单的加减运算再得到结果集,没有思路,后来问辉哥,给我的建议是给这些运算封装成一个SQL函数,select选择字 ...
- HTML5的canvas标签制作黑客帝国里的简单画面
1.加入canvas标签 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> ...
- permutations II(全排列 2)
题目要求 Given a collection of numbers that might contain duplicates, return all possible unique permuta ...
- Django之AppConfig源码学习
class AppConfig(object) 这个基类描述了一个Django应用以及它的配置信息. 属性: name:django应用的完整python路径,eg.'django.contrib.a ...