代码信息来自于http://ejohn.org/apps/learn/。

可以通过函数的名字在它的内部引用它。

function yell(n){
return n > 0 ? yell(n-1) + "a" : "hiy";
}
console.log( yell(4) === "hiyaaaa", "在函数的内部通过它的名字访问它自己" );

当不通过命名函数来声明时,在其内部如何调用自己?

var ninja = {
yell: function(n){
return n > 0 ? arguments.callee(n-1) + "a" : "hiy";
}
};
console.log( ninja.yell(4) == "hiyaaaa", "arguments.callee 指的是函数自己" );

函数的名字作用域失效。

var ninja = function myNinja(){
console.log( ninja === myNinja, "这个函数的引用和名字是同一个函数" );
};
ninja();
console.log( typeof myNinja === "undefined", "但在函数外面不可以访问" );
console.log( ninja );//function myNinja()

注意,当我们使用命名函数声明再分配给一个变量时,这个函数的名字在内部可以引用,外部却不可以。而分配的变量都可以引用。

当匿名函数为一个对象的属性时,也可以调用它。

var ninja = {
yell: function(n){
return n > 0 ? ninja.yell(n-1) + "a" : "hiy";
}
};
console.log( ninja.yell(4) === "hiyaaaa");//true

通过这个对象的属性,我们可以调用它。

当移除原对象时,会发生什么情况?

var ninja = {
yell: function(n){
return n > 0 ? ninja.yell(n-1) + "a" : "hiy";
}
};
console.log( ninja.yell(4) == "hiyaaaa"); //true var samurai = { yell: ninja.yell };
var ninja = null; try {
samurai.yell(4);
} catch(e){
console.log( "不可以访问啦" );
}

同样的情况,但当我们给匿名函数一个名字时又会?

var ninja = {
yell: function yell(n){
return n > 0 ? yell(n-1) + "a" : "hiy";
}
};
console.log( ninja.yell(4) == "hiyaaaa"); var samurai = { yell: ninja.yell };
var ninja = null;
console.log( samurai.yell(4) == "hiyaaaa", "注意,它仍然可以调用这个函数" );

javascript高级知识分析——函数访问的更多相关文章

  1. javascript高级知识分析——作为对象的函数

    代码信息来自于http://ejohn.org/apps/learn/. 函数和对象是不是非常相似? var obj = {}; var fn = function(){}; console.log( ...

  2. javascript高级知识分析——定义函数

    代码信息来自于http://ejohn.org/apps/learn/. 可以使用哪些方式来声明函数? function isNimble(){ return true; } var canFly = ...

  3. javascript高级知识分析——灵活的参数

    代码信息来自于http://ejohn.org/apps/learn/. 使用数量可变的参数对编程很有好处 function merge(root){ for(i = 0 ; i < argum ...

  4. javascript高级知识分析——上下文

    如果函数是一个对象的属性,那么它可以? var katana = { isSharp: true, use: function(){ this.isSharp = !this.isSharp; } } ...

  5. javascript高级知识分析——实例化

    代码信息来自于http://ejohn.org/apps/learn/. new做了什么? function Ninja(){ this.name = "Ninja"; } var ...

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

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

  7. javascript 高级编程系列 - 函数

    一.函数创建 1. 函数声明 (出现在全局作用域,或局部作用域) function add (a, b) { return a + b; } function add(a, b) { return a ...

  8. JavaScript基础知识(函数)

    函数的基础 函数: 把实现相同功能的代码放到一个函数体中,当想实现这个功能时,直接执行这个函数即可:减少了的冗余:高内聚,低耦合--> 函数的封装: 函数:引用数据类型: var a = 10; ...

  9. JavaScript高级程序设计之函数性能

    setTimeout 比 setInterval 性能更好 // 取代setInterval setTimeout(function self () { // code goes here setTi ...

随机推荐

  1. Python with ASP

    Python with ASP Python with ASP

  2. CGFW时装发布及活动整体一览表

    CGFW时装发布及活动整体一览表 CGFW时装发布及活动整体一览表

  3. javascript第十八课:windowd对象的方法

    window.confirm('确定删除吗?'); //当用户点击一个按钮出发一个事件的时候,弹出一个提示框让网友确认,返回一个bool值,点确定的话,返回true,点取消,返回flase windo ...

  4. android 实现自己定义状态栏通知(Status Notification)

    在android项目的开发中,有时为了实现和用户更好的交互,在通知栏这一小小的旮旯里,我们通常须要将内容丰富起来,这个时候我们就须要去实现自己定义的通知栏,比如以下360或者网易的样式: 首先我们要了 ...

  5. python基础教程_学习笔记14:标准库:一些最爱——re

    标准库:一些最爱 re re模块包括对正則表達式的支持,由于以前系统学习过正則表達式,所以基础内容略过,直接看python对于正則表達式的支持. 正則表達式的学习,见<Mastering Reg ...

  6. Cassandra监控 - OpsCenter手册

    注:本文转自:http://eric100.blog.51cto.com/2535573/1717792 Opscenter用户手册 1.       OpsCenter简介 DataStaxOpsC ...

  7. 第一个关于ajax的代码

    昨天由于需要,写了第一个需要ajax的程序,之前只是看过相关介绍,没想到这么有用,记录一下,如有错误,还希望大家提出$(document).ready(function () {//获取url中名字为 ...

  8. ChildNodes详解及其兼容性处理方式

    写在前面:在做insertBefore插入节点练习时发现一个问题,插入childNodes[0]和childNodes[1]时插入的位置是一样的!于是有了childNodes的了解,有了这篇文章,欢迎 ...

  9. C# 获取类似java gettime() 的时间格式

    今天做了一个面向Java的接口,需要做到时间的统一,C#提供了System.DateTime.UtcNow 但是需要自己做下处理,记录一下自己的方法, 留着以后查阅方便. /// <summar ...

  10. vim命令杂记

    vim 实用命令. . . 命令重复上一次修改动作 >G 增加当前行到文档末尾处的缩进 C 相当于c$,更改当前位置 至 行尾的单词 S 相当于^c , 更改一行 : 重复上次的f命令所查找的字 ...