第七章 函数表达式和函数声明,关于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 - ... 
随机推荐
- Linux进程管理 - PRI,nice,free,uname,netstat
			优先运行序 (priority, PRI) 这个 PRI 值越低代表越优先的意思.不过这个 PRI 值是由核心动态调整的, 使用者无法直接调整 PRI 值的. 由於 PRI 是核心动态调整的,我们使用 ... 
- schema workbench的操作
			1.schema workbench连不上sql,如下: 看不懂,这是驱动的问题,你只要使用最新的驱动,mysql-connector-java-5.1.13-bin.jar 将对应驱动放入schem ... 
- 客户全局信用控制&非全局信用控制
			看个简单的例子 客户信用限额 非全局信用控制 非全局信用控制比较简单,我们看一下全局信用控制 设置: 实现结果:全局&非全局对比 
- LeetCode(32)-Binary Tree Level Order Traversal
			题目: LeetCode Premium Subscription Problems Pick One Mock Articles Discuss Book fengsehng 102. Binary ... 
- linux 下使用 tc 模拟网络延迟和丢包
			1 模拟延迟传输简介 netem 与 tc: netem 是 Linux 2.6 及以上内核版本提供的一个网络模拟功能模块.该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能,诸如低带 ... 
- jQuery之select的option怎样绑定事件
			HTML: <select id='select'> <option value='0'>上海</option> <option value='1'>北 ... 
- HTML DOM 实例
			DOMAnchor 对象 更改一个链接的文本.URL 以及 target 使用 focus() 和 blur() 向超链接添加快捷键 Document 对象 使用 document.write() 向 ... 
- 解密for循环工作机制之迭代器,以及生成器、三元表达式与列表解析、解压序列
			本节内容 1.迭代器协议与for循环 2.三元表达式 3.解压序列 4.列表解析 5.生成器 迭代器协议与for循环 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中下一项, ... 
- 【Web页面测试】测试点和测试用例
			1. 需求符合度测试 1. 各级菜单名称显示是否按照需求说明书规定的设计,并且没有遗漏和多余 2. 各级菜单所完成的功能是否按照需求说明书规定的设计,并且没有遗漏和多余 3. 各级菜单的操作顺序和操作 ... 
- Pod install 之后 no such module
			官方文档在pod install之后的操作是: open App.xcworkspace 使用pod以后,项目的旧打开方式就不行了,必须到项目目录里面,打开“项目名.xcworkspace”这种方式来 ... 
