一:函数表达式和函数声明

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(){})() ,私有变量和特权方法的更多相关文章

  1. js函数表达式和函数声明的区别

    我们已经知道,在任意代码片段外部添加包装函数,可以将内部的变量和函数定义"隐 藏"起来,外部作用域无法访问包装函数内部的任何内容. 例如: var a = 2; function ...

  2. js基础:函数表达式和函数声明

    函数表达式和函数声明的区别.实际上,解析器在向执行环境中加载数据是,对函数表达式和函数声明并非一视同仁.解析器会率先读取函数声明,并使其在执行任何代码之前可用.而函数表达式,则必须等到解析器执行到它所 ...

  3. js中 函数声明/函数表达式/匿名函数/箭头函数/立即执行函数

    函数声明: function add(a, b) { // ... } 1.顾名思义,声明一个函数, 用关键字 “function” 来告诉,这是一个函数. 2.任何地方,想用就可以拿过来使用 函数表 ...

  4. JS中函数表达式与函数声明的区别

    hello,沐晴又来更新啦,今天呢,跟大家讲讲让人头疼的函数表达式和函数声明,反正我当初看那本高级程序的时候,是没怎么看太透,哈哈.我是个比较重基础的人,跟我一起探讨函数表达式和函数声明的世界吧. 首 ...

  5. 变量声明置顶规则、函数声明及函数表达式和函数的arguments属性初始化

    一.变量声明和变量赋值: if (!("a" in window)) { ; } alert(a);//a为? 你可能认为alert出来的结果是1,然后实际结果是“undefine ...

  6. JavaScript函数表达式与函数声明

    什么是函数? 函数是事件驱动或者被调用时执行的重复代码块. 作用域: 1. 全局作用域 2. 函数作用域(局部作用域) var i = 100; //全局作用域 function fun(){ var ...

  7. javascript笔记05:函数表达式和函数语句的区别

    1.首先是函数语句: myfunc(); function myfunc() { //执行一些语句 } 当函数语句被定义的时候,在一个脚本代码被优先考虑,因此,无论该函数是定义之前或者定义之后都可以被 ...

  8. 第七章 python基础之函数,递归,内置函数

    五 局部变量和全局变量 name='cyj' #在程序的一开始定义的变量称为全局变量. def change_name(): global name #global 定义修改全局变量. name=&q ...

  9. JAVASCRIPT高程笔记-------第 七章 函数表达式

    7.1递归 经典递归例子 function factorial(num){ if(num <= 1){ return 1; }else{ return num * factorial(num - ...

随机推荐

  1. Hibernate学习大全

    第1课 课程内容. 6 第2课Hibernate UML图. 6 第3课 风格. 7 第4课 资源. 7 第5课 环境准备. 7 第6课 第一个示例HibernateHelloWorld 7 第7课 ...

  2. Volley解析之表单提交篇

    要实现表单的提交,就要知道表单提交的数据格式是怎么样,这里我从某知名网站抓了一条数据,先来分析别人提交表单的数据格式.  数据包: Connection: keep-alive Content-Len ...

  3. obj-c属性的新的特性

    在以前的objc中我们必须在接口中定义属性对应的实例方法,然后在实现文件中"同步"该属性,如下代码: @interface Foo:NSObject{ NSString *name ...

  4. 初探linux子系统集之led子系统(二)

    巴西世界杯,德国7比1东道主,那个惨不忍睹啊,早上起来看新闻,第一眼看到7:1还以为点球也能踢成这样,后来想想,点球对多嘛6比1啊,接着就是各种新闻铺天盖地的来了.其实失败并没有什么,人生若是能够成功 ...

  5. SharePoint 使用技巧汇总与讨论

    1.  网站内容和结构(/_layouts/sitemanager.aspx) 自己使用SharePoint也有一年了,居然没有发现这个页面,鄙视自己一下,才发现这个页对数据进行操作,会方便很多,比如 ...

  6. C++——虚函数问题小集

    学习C++ 不可避免地会遇到虚函数的问题,下面几个问题在学习初期或多或少会存在一些疑惑,所以便将其总结了下来. 1.为什么静态成员函数.构造函数不能定义为虚函数? 因为静态成员函数是一个大家共享的一个 ...

  7. Day4_迭代器

    迭代器: 是一个重复的过程,每一次重复都是基于上一次的结果而来. 可迭代对象: 凡是对象有_iter_方法(对象._iter_),该对象就是可迭代对象. 字符串,列表,元组,字典等都是可迭代对象. 可 ...

  8. FFPLAY的原理(三)

    播放声音 现在我们要来播放声音.SDL也为我们准备了输出声音的方法.函数SDL_OpenAudio()本身就是用来打开声音设备的.它使用一个叫做SDL_AudioSpec结构体作为参数,这个结构体中包 ...

  9. Java获取当日的起始时间,结束时间,现在时间,是否在时间段中。

    当日的起始时间 public static Date getTodayStartTime() { Calendar todayStart = Calendar.getInstance(); today ...

  10. HTML编码和CSS编码会遇到的问

    http://codeguide.bootcss.com/#html-syntax  参考链接 属性顺序 HTML 属性应当按照以下给出的顺序依次排列,确保代码的易读性. class id, name ...