`
389yufeng
  • 浏览: 25603 次
  • 性别: Icon_minigender_1
  • 来自: 福州
文章分类
社区版块
存档分类
最新评论

函数闭包,作用域,对象继承

阅读更多
闭包,是指词法表示包括不必计算的变量的函数,即该函数能使用函数外定义的变量
eg:简单闭包实例
var Msg='Hello world';
function myfun(){
  alert(Msg);
}

注:函数捕获Msg的值只是为以后使用,即函数程序调用函数时要检查Msg的值.
eg:在一个函数中定义另一个函数(复杂闭包)
var Num=10;
function myfun(iNum1,iNum2){
    function addfun(){
       return iNum1+iNum2+Num;
    }
    return addfun()
}
myfun(10,10) //调用函数,返回结果

注:内函数是一个闭包,因从外部函数中获取两个参数值(iNum1,iNum2)以及全局变量
最后,外部函数调用addfun(),执行加法运算并返回值
闭包函数不必定义参数,使用的值从执行环境中获取.

作用域:
window作用域,function作用域
var,this关键字

一个有趣的比喻:
var ima_celebrity = "Everyone can see me!",
the_president = "I'm the decider!";

function pleasantville() {
  var the_mayor = "I rule Pleasantville with an iron fist!",
  ima_celebrity = "All my neighbors know who I am!";

  function lonely_house() {
     var agoraphobic = "I fear the day star!",
     a_cat = "Meow.";
  }
}

ima_celebrity, 家喻户晓(所有人都认识她)。她在政治上积极活跃,敢于在一个相当频繁的基层上叫嚣总统(即the_president)。她会为碰到的每一个人

签名和回答问题。就是说,她不会跟她的粉丝有私下的联系。她相当清楚粉丝们的存在并有他们自己某种程度上的个人生活,但也可以肯定的是,她并不知道

粉丝们在干嘛,甚至连粉丝的名字都不知道。

而在欢乐市(pleasantville)内,市长(the_mayor)是众所周知的。她经常在她的城镇内散步,跟她的选民聊天、握手并亲吻小孩。因为欢乐市

(pleasantville)还算比较大且重要的邻居。她还可以看到市郊外山上的孤屋(lonely_house),但从不在意里面住着的是谁。

而孤屋(lonely_house)是一个自我的世界。旷恐患者时常在里面囔囔自语,玩纸牌和喂养一个小猫(a_cat)。他偶尔会给市长(the_mayor)打电话咨询一

些本地的噪音管制.

笔记:
1.全局变量,所有函数都可以使用,不必管function是作什么用,只提供数值.
2.函数的变量,只能在该函数作用域内使用,超出范围则不能够使.
3.闭包函数,可以使外函数的变量以及外函数的传入的参数.

作用域this关键字使用

1.对象的呼叫
<script type="text/javascript">
var Obj = {
 the_Num: 42,
 ask_question: function () {
    return this.the_Num;
  }
};
var show = Obj.ask_question();
alert(show);
</script>


2.构造函数
<script type="text/javascript">
function myfun(iNum){
  this.Num=iNum;
  this.show=function(){
     return this.Num;
  }
}
var myNum= new myfun(40);
alert(myNum.show());  //注:要带括号,不然变成引用方法.
</script>


3.客户端函数呼叫(window作用域)
function myfun(){
  return this;  //window对象
}
var myWin=myfun();


4.事件处理函数
行内调用:
<button value="button" onclick="alert(this.nodeName)"></button>
页面调用:
function myfun(){
   alert(this.nodeName);  //window对象,出错
}
对象函数:
btn.onclick=function(){
   alert(this.nodeName);
}

5.区分DOM对象与window对象
<script type="text/javascript">
//构造函数
function BigComputer(answer) {
  this.name = answer;   //注意与DOM对象name的区分
  this.show = function () {
  alert(this.name);
  }
}

function myfun() {
   var win = new BigComputer(42),
   btn = document.getElementById('btn');
   btn.onclick = win.show; //DOM对象name的属性,而不是win实例的name
//btn.onclick = win.show.call(win); //????Call(this);
}

window.onload = myfun;
</script>
<button id='btn' name="0" onclick='myfun()'>Click me!</button>

call立即执行了函数(译注:其实可以用一个匿名函数封装,例如the_button.onclick = function(){deep_thought.ask_question.call(deep_thought);}),

我们给onclcik处理函数一个函数执行后的结果而非函数的引用.

6.Call()和apply()执行函数呼叫,继承
Call()
<script type="text/javascript">
var first_object = {
  num: 42
};
var second_object = {
  num: 24
};

function multiply(mult) {
  return this.num * mult;
}

multiply.call(first_object, 5); // 返回 42 * 5
multiply.call(second_object, 5); // 返回 24 * 5
</script>

call的第一个参数定义了在已执行的函数内this的所指对象。其余的参数则传入业已执行的函数内,如同函数的自身呼叫一般。
var first_object= {
   num:42
};
function multiply(mult,iNum){
   return this.num*mult;
}

multiply.call(first_object,[5],[6]);


7.bind()
Function.prototype.bind = function(obj) {
  var method = this,
  temp = function(){   //闭包
     return method.apply(obj, arguments);
  };
  return temp;
}
bind返回的是函数引用可以备用,而不是call的立即执行而产生的最终结果

对象继承:
1.对象冒充   //this.omath=classA; this.omath(ocolor);
2.Call()、apply()方法  //调用对象方法,以另一对象替代当前对象
  第一个参数是在扫行函数this所指的对象,其余按函数参数传递.
3.原型链形式:classB.prototype=new ClassA();
4.混合方法:
   a.Call()方法不支持继承基类原型(prototype)定义的属性、方法
   b.原型方法--不支持参数的传递
分享到:
评论

相关推荐

    005课-继承作用域闭包.rar

    在JavaScript编程语言中,"继承、作用域和闭包"是三个非常重要的概念,它们构成了JavaScript面向对象特性和函数式编程的核心。在这个005课的主题中,我们将深入探讨这三个概念,理解它们如何协同工作,以及如何在...

    JavaScript碎片—函数闭包(模拟面向对象)

    当变量不使用var声明时,它们会变成全局变量,而使用var声明的变量则只在闭包作用域内有效。由于JavaScript中函数可以返回对象,这些对象又可以拥有方法和属性,因此可以使用函数闭包来创建封装的方法。 在面向对象...

    JavaScript作用域、闭包、对象与原型链概念及用法实例总结

    JavaScript是Web开发中不可或缺的一部分,它提供了丰富的特性,如作用域、闭包、对象和原型链,这些都是理解和编写高效代码的关键。以下是对这些概念的详细解释: 1. **JavaScript变量作用域** - **函数作用域**:...

    JavaScript:函数与作用域

    - 不绑定自己的`this`,而是从外围作用域继承`this`。 - **示例**: ```javascript var obj = { value: 10, logValue: function() { console.log(this.value); }, logValueArrow: () =&gt; { console.log...

    原型、作用域、闭包的完整解释(一)

    最后,闭包是一种特殊的函数,它可以访问其自身、外部函数以及全局作用域中的变量,即使在其外部函数已经执行完毕后。闭包的主要用途是实现数据封装,创建私有变量和方法,以及在异步操作中保持状态。理解闭包的关键...

    深度探讨javascript函数的原型链和闭包

    闭包是理解作用域链的关键概念,它允许内部函数记住其定义时的作用域,即使外部函数已经完成执行。闭包常常用于封装变量和实现私有方法,提高代码的封装性和安全性。 总结一下,JavaScript中的函数不仅是一种数据...

    深入理解JavaScript作用域共12页.pdf.zip

    10. **箭头函数与作用域**:箭头函数不创建自己的`this`,它会继承自父作用域的`this`值。这一点与传统函数不同,后者`this`的值取决于函数的调用方式。 以上就是对"深入理解JavaScript作用域"的详细解析,涵盖了一...

    我所理解的this,闭包,原型链,继承及面向对象.zip

    闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见方式就是在一个函数内部创建另一个函数。闭包可以用来保存状态,实现私有变量,以及在异步操作中保留作用域。 例如: ```javascript function ...

    JS继承与闭包及JS实现继承的三种方式

    而闭包则是一种特殊的函数,它可以访问其自身、函数内部以及外部作用域的变量,即使在外部函数执行完毕后,仍然可以保持对内部变量的访问。 **继承的三种方式** 1. **扩展`Object.prototype`实现继承** 这种方法...

    js闭包是什么?.pdf

    闭包之所以能访问外层函数的变量,就是因为这些变量对象存在于闭包创建时的作用域链中。 执行上下文包括变量对象(Variable Object, VO)、作用域链(Scope Chain)和`this`的值。其中,变量对象包含了函数的参数、...

    细品javascript 寻址,闭包,对象模型和相关问题.docx

    闭包是JavaScript的一个重要特性,它允许一个函数访问并操作其外部作用域中的变量。这种特性使得函数可以记住并访问在其外部作用域定义的变量,即使这些变量已经不在其直接可访问的作用域内。 **1. 闭包的工作原理*...

    Javascript-Sandbox:JavaScript 中的作用域、闭包、面向对象和异步编程

    本篇文章将深入探讨JavaScript中的四个关键概念:作用域、闭包、面向对象(OLOO)以及异步编程,这些都是JavaScript开发者必备的知识点。 1. **作用域**: JavaScript中的作用域决定了变量的可见性和生命周期。...

    js闭包详细讲解

    **闭包**是JavaScript语言的一个重要特性,它使得函数可以访问并操作其外部作用域内的变量,即使该函数在其外部作用域之外被调用。要理解闭包,首先需要了解JavaScript的作用域规则。 ##### 1.1 作用域 在...

    深入理解javascript原型和闭包1

    至此,我们讨论了JavaScript中一些核心的概念,包括对象、函数、原型、继承、执行上下文、作用域和闭包。理解这些概念对于深入掌握JavaScript至关重要。 (17)——补this `this`的绑定策略在JavaScript中比较复杂...

    关于javascript 回调函数中变量作用域的讨论

    闭包使得函数能够记住在其词法作用域内声明的变量,即使这些变量在函数外部也被销毁。 #### 三、问题描述 在实际开发过程中,有时会遇到这样的情况:当回调函数作为某个对象的方法时,回调函数执行时的上下文并非该...

Global site tag (gtag.js) - Google Analytics