1. Arguments对象
   l检测参数个数
1.在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们。

function howManyArgs() {

alert(arguments.length);

}

howManyArgs

howManyArgs

howManyArgs

  • 模拟函数重载

     function doAdd() {

) {

alert);

) {

alert]);

}

}

doAdd); //输出 "15"

doAdd); //输出 "60"

2.变量的作用域
  l全局变量与局部变量(为什么)

;

function f(){

;

global++;

return "global = "+global;

}

alert(f());  //output  global = 2

alert(f());  //output  global = 3

alert(local);  //output  local is undefined

结论:全局变量的值会被局部变量修改。而函数外部无法访问局部变量。

l声明局部变量(没有使用var)

function f(){

local ;

}

alert(local);  //output  local is undefined

f();

alert(local);  //output  global = 2

说明:

l在函数f() 中定义了一个变量local。在该函数被调用之前,这个变量是不存在的。
llocal变量会在f() 函数首次被调用时创建,并赋予全局作用域。
函数域与全局域

;

function f(){

alert(a);  //output  undefined

;

alert(a);  //output  1

}

f();

结论:

l函数域始终优先于全局域,所以局部变量a会覆盖与它同名的全局变量。

3.匿名函数

javascript可以将函数作为数据使用。作为函数本体,它像普通的数据一样,不一定要有名字。默认名字的函数被称之为“匿名函数”。例如:

function (a){return a;}

匿名函数的两种用法:

l可以将匿名函数作为参数传递给其他函数。这样,接收方函数就能利用所传递的函数来完成某些事情。
l可以定义某个匿名函数来执行某些一次性任务

4.回调函数

function add(a, b){

return a() + b();

}

;}

;}

alert(add(one,two));  //output  3

//可以直接使用匿名函数来替代one()和two(),以作为目标函数的参数(这才是回调函数,上面的不是

alert;}));

总结:

l在这个例子中,函数one和two都是回调函数。
l当将函数A传递给函数B,并由B来执行A时,A就成了一个回调函数(callback function)。如果A还是一个无名函数,就称之为匿名回调函数。

l回调函数的优点:(总结)

l它可以在不做命名的情况下传递函数(这意味着可以节省全局变量)。
l可以将一个函数调用操作委托给另一个函数(这意味着可以节省一些代码编写工作)。
l回调函数也有助于提升性能。(重要)

l下面的代码,利用回调函数如何优化?

,并以数组的形式返回结果

function two(a, b, c){

var i, arr = [];

; i++){

arr;

}

return arr;

}

//将接收的参数加一后返回

function addone(a){

;

}

//测试上面的两个函数

alert));  //output  [2, 4, 6]

alert));  //output  101

//将三个数据在两个函数之间传递

var myarr = [];

myarr );

; i++){

myarr[i] = addone(myarr[i]);

}

alert(myarr);  //output  [21, 41, 61]

------------------------------------------------------------------------

/*

* 以上代码可以工作,但是显然不够优化。

* 这里使用了两次循环。如果处理的数据量很大火循环操作很复杂的话,开销一定不小。

*/

//优化之后的代码(修改two函数)

function two(a, b, c, callback){

var i, arr = [];

; i++){

arr);

}

return arr;

}

myarr , addone);

alert(myarr);  //output  [3, 5, 7]

//还可以使用匿名函数来替代addone函数

myarr ;});

5.自调函数

自调函数 —— 其实就是在定义函数后自行调用。(思考:自调函数的优点)
(1)例如:

(
  function(){
  alert("javascript");
  }
 )()

解释说明:

l第一对括号,放置的是一个匿名函数。

l第二对括号的作用,是“立即调用”。

l自调函数只需:将匿名函数的定义放进一对括号中,然后外面再跟一对括号即可。

(2)例如:

(

function(name){

alert("Hello " + name + "!");

}

)("javascript")

//output  Hello javascript!

解释说明:

l第一个括号中的匿名函数接受一个参数。

l第二个括号,在调用时,向匿名函数传递参数内容。
6.内部(私有)函数

function a(param){

function b(input){

;

};

return "The result is " + b(param);

}

alert));  //The result is 4

    解释说明:
l当调用全局函数a ( ) 时,本地函数b ( ) 也会在其内部被调用。由于b ( ) 是本地函数,它在a ( ) 以外的地方是不可见的,所以将b 称之为私有函数。

总结:
 l私有函数的优点:

l有助于确保全局名字空间的纯净性(这意味着命名冲突的机会很小)。
l私有性 —— 只将一些必要的函数暴露给“外面世界”,并保留属于自己的函数,使它们不为该应用程序的其他部分所用。
7.闭包
    7.1作用域链
ljavascript不存在大括号级的作用域,但具有函数作用域。
l在函数内定义的变量在函数外是不可见的。但如果该变量是在某个代码块中定义的(如在某个if或for语句中),它在代码块外是可见的。(不太明白这是什么意思?)
例如1:

;

function f(){

;

return a;

}

alert(f());  //output  1

alert(b);  //output  b is undefined

补充说明:

l变量a 是属于全局域的,变量b 的作用域是属于函数f ( ) 内。
l在f ( ) 内,a 和b 都是可见的。
l在f ( ) 外,a 是可见的,b 则是不可见的。

例如2:

;

function f(){

;

function n(){

;

alert(a);  //output  1

alert(b);  //output  2

alert(c);  //output  3

}

return n();

}

f();

    补充说明:    

l函数n ( ) 可以访问的变量可以是自身的作用域,也可以是其“父级”的作用域。这就形成了一条作用域链。

例如3:

function f1(){

;

f2();

}

function f2(){

return a;

}

alert(f1());  //output  a is undefined

补充说明:

l在定义函数f1 ( ) 和f2 ( ) 时,只能访问全局作用域和其自身的作用域。
l在定义函数f2 ( ) 时,变量a 是不可见的。

例如4:

;

function f1(){

;

f2();

}

function f2(){

return a;

}

alert(f1());  //output  5

补充说明:

l在定义函数f1 ( ) 和f2 ( ) 时,都是可以访问全局作用域的。
    7.1闭包 
 
l定义:指的是词法表示包括不被计算的变量的函数,也就是说,函数可以使用函数之外定义的变量(本质)
l闭包的实现

var b;

function a(){

var a = "a";

b = function(){

return a + "b";

}

return a;

}

//测试

alert(a());  //output  a

alert(b());  //output  ab

补充说明:

l在a ( ) 函数中定义了 b ( ) 函数,所以b ( ) 函数可以访问a ( ) 函数的作用域。
l将 b ( ) 函数升级到全局函数,但依然保留可以对a ( ) 函数作用域的访问权。
 
    7.1循环中的闭包 
        例如1:(小难)

function f(){

var a = [];

var i;

; i++){

a[i] = function(){//a[i]是一个闭包

return i;

}

}

return a;

}

var fun = f();

alert]());  //output  3

alert]());  //output  3

alert]());  //output  3

补充说明:

l按照预期,最终结果应该输出 [0 , 1 , 2 ],但是却是[ 3 , 3 , 3 ]。
l在函数 f ( ) 中,我们通过循环,创建了三个闭包,它们都指向了共同的局部变量 i 。
l但是,闭包并不会记录它们的值,它们所拥有的只是一个 i 的连接(即引用),因此只能返回i 的当前值。

例如2:(对比例1)

function f(){

var a = [];

var i;

; i++){

a[i] = (function(x){

return x;

})(i);

}

return a;

}

var fun = f();

alert]);  //output  0

alert]);  //output  1

alert]);  //output  2

补充说明:

l在这里,我们不再直接创建一个返回i 的函数,而是将i 传递给了一个自调函数。
l在该自调函数中,i 就被赋值给了局部变量x ,这样一来,每次迭代中的x 就会拥有各自不同的值了

例如3:下面这种,是不使用自调函数的用法。

function f(){

function n(x){

return x;

}

var a = [];

var i;

; i++){

a[i] = n(i);

}

return a;

}

var fun = f();

alert]);  //output  0

alert]);  //output  1

alert

 
 

高级js--(面向对象js,arguments,闭包,自调)的更多相关文章

  1. Vue ---- vue的基本使用 文本/事件/属性指令 补充: js面向对象 js函数

    目录 日考题(知识点)

  2. 5月17日上课笔记-js面向对象

    二.js面向对象 js创建对象: var 对象名称 = new Object(); person.name = "小明"; //姓名 person.age = 18; person ...

  3. 带你一分钟理解闭包--js面向对象编程

    上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...

  4. JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  5. JavaScript基础精华02(函数声明,arguments对象,匿名函数,JS面向对象基础)

    函数声明 JavaScript中声明函数的方式:(无需声明返回值类型) function add(i1, i2) {             return i1 + i2;//如果不写return返回 ...

  6. 第十五节 JS面向对象实例及高级

    实例:面向对象的选项卡 把面向过程的程序,改写成面向对象的形式 原则:不能有函数套函数,但可以有全局变量 过程: onload —— 改写成 构造函数,其中window.onload的功能是在页面加载 ...

  7. ES6教程-字符串,函数的参数,了解函数的arguments对象,js面向对象,设计模式-单例模式,解构赋值

    前言 主要讲解了ES6对字符串的拓展,包括includes,startsWith和endsWith,另外增加了字符串模板. Start includes()是否包含 startsWith()以什么开头 ...

  8. 前端(十三)—— JavaScript高级:回调函数、闭包、循环绑定、面向对象、定时器

    回调函数.闭包.循环绑定.面向对象.定时器 一.函数高级 1.函数回调 // 回调函数 function callback(data) {} // 逻辑函数 function func(callbac ...

  9. Js面向对象编程

    Js面向对象编程 1.     什么是面向对象编程? 我也不说不清楚什么是面向对象,反正就那么回事吧. 编程有时候是一件很快乐的事,写一些小游戏,用编程的方式玩游戏等等 2.     Js如何定义一个 ...

  10. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十五 ║Vue基础:JS面向对象&字面量& this字

    缘起 书接上文<从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十四 ║ VUE 计划书 & 我的前后端开发简史>,昨天咱们说到了以我的经历说明的web开发经历的 ...

随机推荐

  1. Flashbuilder的bug FlashBuilder 1119: 访问可能未定义的属性 on (通过 static 类型

    FlashBuilder 1119: 访问可能未定义的属性 on (通过 static 类型 当此问题出现的时候 无论 刷新 清理 注释 删除 乃至重启电脑都无济于事. 解决方法:备份此类到另外一个地 ...

  2. Tom与Jerry谁先死?

    有如下问题:Tom的攻击力为113,血量为688,Jerry的攻击力为112,血量为691.每一个回合他们各攻击对方一次,请问谁先死? 这是一个简单的“人狗大战问题”,我们只要利用类的继承,在原有的基 ...

  3. typescript泛型类 泛型方法

    /* 泛型:软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性. 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能. 在像C# ...

  4. UI相关教程:HUD、UMG和Widget

    转自:http://aigo.iteye.com/blog/2258612 蓝图脚本来处理 ================================================== 用UM ...

  5. spark使用hadoop native库

    默认情况下,hadoop官方发布的二进制包是不包含native库的,native库是用C++实现的,用于进行一些CPU密集型计算,如压缩.比如apache kylin在进行预计算时为了减少预计算的数据 ...

  6. (转)深入sql server中的事务

    原文地址:http://www.cnblogs.com/chnking/archive/2007/05/27/761209.html 参考文章:http://www.cnblogs.com/zhuif ...

  7. CS229 6.7 Neurons Networks whitening

    PCA的过程结束后,还有一个与之相关的预处理步骤,白化(whitening) 对于输入数据之间有很强的相关性,所以用于训练数据是有很大冗余的,白化的作用就是降低输入数据的冗余,通过白化可以达到(1)降 ...

  8. MySQL多表查询,pymysql模块。

    一 多表查询: 首先什么是多表查询: 我们在实际工作中,不可能把数据都存入一个表中,那么又需要这些表之间有一定的关联,因为表与表之间的数据是相关联的,所以就要用到我们的外键将多表连接到一起,那么我们更 ...

  9. ES6的学习记录

    1.let命令: 基本用法: ES6新增了let命令,用来声明变量.用法类似于var,但是所声明的变量只在let命令所在的代码块内有效. { let a = 10; var b = 1; } cons ...

  10. Apache服务器下phalcon项目报Mod-Rewrite is not enabled问题

    问题如图: 项目已经按照官网的教程修改了.htaccess文件,仍旧报此错误,判断可能是apache未添加mod_rewrite,通过查询资料,经以下两步解决此问题: 1.执行sudo a2enmod ...