有关JS的问题,持续更新..

一,函数调用的4种方式

  1,函数调用模式

  //下面这种模式叫 “函数调用模式”:窗后window来调用
  //函数调用四种方式的基础
  //这tm不就是作用域this的问题吗
  //我们最常用的定义函数方式,function a(){}就是"函数调用模式",只要记得这种方法内的this是window便可。

 function whichObj1() {
            this.a = 1;     //this==> window
            alert(this.a+'+'+this);
        }
        whichObj1(); //本质window. whichObj1();用window可以“点”出这个方法
  
        /*下面的定义函数,函数内的this,注意不是whichObj2,是window*/
        /*这种采用var的定义函数方式,和 function whichObj2(){}一样*/
        var whichObj2 = function () {
            this.a = 2;     //this==> window
            alert(this.a + '+' + this);
        }
        whichObj2(); //本质window. whichObj1();用window可以“点”出这个方法

你懂this吗

  函数调用函数

 function fun1() {
            alert("fun1");
        }
        function fun2() {
            fun1(); // 在函数B中,调用A方法
            alert("fun2");
        }
        fun2();

fun1(){fun2()},fun1执行的就是fun2()

  下面看一个例子

 <script type="text/javascript">
    var add = function(a, b) {
         return a + b;
     }
  
     var myObject = {
         value:3
     };
  
     myObject.func = function() {
         var helper = function() {
             this.value = add(this.value, this.value); //此处3个value均为NAN,因为this指向window
         }
  
     // 函数调用模式
       helper();
     }
      
   // 方法调用模式
    myObject.func();
  
     alert(myObject.value);//为3不是6
              
 </script>
  
  
 //为什么不是6呢
 //改进
 <script type="text/javascript">
     var add = function(a, b) {
         return a + b;
     }
  
     var myObject = {
         value:3
     };
  
     myObject.func = function() {
         var that = this; // this对应myObject对象   (1)
         var helper = function() {
             //this.value = add(this.value, this.value); //这里调用模式为函数调用模式,而非方法调用模式,所以this对应全局对象   (2)
             that.value = add(that.value, that.value);
         }
     
     // 函数调用模式
       helper();
     }
       
   // 方法调用模式  
    myObject.func();
  
     alert(myObject.value);
              
 </script>

函数调用模式:window直接调用。不是某个对象调用。

  2,方法调用模式

  //下面这种模式叫 “方法调用模式”:方法作为一个json对象的成员来调用。一般函数做为成员,我们通常称之为方法
  //这种调用模式,方法内的this指的是本json对象
  //这个json对象,随意可以"点"出一个成员(加入'点'出方法,那么这个方法内的this记得是这个json对象)

 function makeArray(arg1, arg2) {
            return [this, arg1, arg2];
        }
        var arrayMaker = {
            someProperty: 'some value here',
            make: makeArray
        };
  
        //invoke the make() method
       console.log(arrayMaker.make('one', 'two'));
        // => [ arrayMaker, 'one', 'two' ]
       console.log(arrayMaker['make']('one', 'two'));
        // => [ arrayMaker, 'one', 'two' ]

方法调用模式,json对象调用成员的2中方式

   方法调用模式和函数调用模式区别:this的大转变

  function makeArray(arg1, arg2) {
             return [this, arg1, arg2];
         }
 console.log(makeArray('one', 'two'));//this指向window
 //但是将此函数放到json对象,为为一个方法来调用,怎么this就从window变成了json对象了呢?

方法调用模式和函数调用模式的对比,同一个函数,this指向怎么就变了呢?

我们不去谈理论上的作用域链,记住:哪个对象调用这个fucntion a(){this...},这this就指哪个对象。

上面在一个函数里面:var helper=function(){this.value..},请问这个helper函数的调用对象是谁?

没写默认值window,ok,所以this指向window。json对象调用,ok,this就是这个json对象。

哦,有人和var 这个有点乱,明确:和私有、公有木有关系。

哦,有人和fucntion helper(){this..}这种有点乱,明确:这两种几乎一样,ok,就把这两种当成一样。

再说,内嵌的函数使用外部函数的变量,也就是形成了闭包。

现在想一想,这两种模式,本质都一样嘛~window也是对象嘛~~为啥window调用函数非叫“函数调用模式”呢?其实就是比较”特殊的方法调用模式“而已。

不行,我还要举个常用的例子,看真正懂上面的不

 <input type="button" value="Button 1" id="btn1"  />
 <input type="button" value="Button 2" id="btn2"  />
 <input type="button" value="Button 3" id="btn3"  onclick="buttonClicked();"/>
  
 <script type="text/javascript">
 function buttonClicked(){
     var text = (this === window) ? 'window' : this.id;
     alert( text );
 }
 var button1 = document.getElementById('btn1');
 var button2 = document.getElementById('btn2');
  
 button1.onclick = buttonClicked;
 button2.onclick = function(){   buttonClicked();   };
 </script>

input的click事件中的this

第四

function doSomething (obj,evt) {
     var text =obj===window?window:obj.id;
     alert(text);//child2
 } 

<div id="child2" onclick="doSomething(this,event);" style="width:200px;height:200px;background-color:lightblue;">

  

第一,this为所属的对象(按钮元素)。btn1

第二,外函数调用内函数,内函数函数体的this指的window。是window调用的。window

第三,和第二个一样。window

第四,dom中的this,指向就是这个dom元素

  3,构造器调用模式

有关这个篇幅要长..

  4,call apply调用方式

区别:call方法传参的时候,多加一个对象,参数依次写就ok。apply,多传一个对象,参数必须放到数组内

JavaScript系列:函数调用方式的更多相关文章

  1. JavaScript中七种函数调用方式及对应 this 的含义

    this 在 JavaScript 开发中占有相当重要的地位,不过很多人对this这个东西都感觉到琢磨不透.要真正理解JavaScript的函数机制,就非常有必要搞清楚this到底是怎么回事. 函数调 ...

  2. 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点

    深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点 2011-12-28 23:00 by 汤姆大叔, 139489 阅读, 119 评论, 收藏, 编辑 才华横溢的 ...

  3. javascript系列之this

    原文:javascript系列之this 引言 在这篇文章里我们将会讨论与执行上下文直接相关的更多细节.讨论的主题就是this关键字.实践证明,这个主题是足够难的并且在不同的执行上下文中判定this的 ...

  4. JavaScript 系列博客(三)

    JavaScript 系列博客(三) 前言 本篇介绍 JavaScript 中的函数知识. 函数的三种声明方法 function 命令 可以类比为 python 中的 def 关键词. functio ...

  5. javaScript系列 [06]-javaScript和this

    在javaScript系列 [01]-javaScript函数基础这篇文章中我已经简单介绍了JavaScript语言在函数使用中this的指向问题,虽然篇幅不长,但其实最重要的部分已经讲清楚了,这篇文 ...

  6. 深入理解JavaScript系列(26):设计模式之构造函数模式

    介绍 构造函数大家都很熟悉了,不过如果你是新手,还是有必要来了解一下什么叫构造函数的.构造函数用于创建特定类型的对象——不仅声明了使用的对象,构造函数还可以接受参数以便第一次创建对象的时候设置对象的成 ...

  7. 深入理解JavaScript系列(24):JavaScript与DOM(下)

    介绍 上一章我们介绍了JavaScript的基本内容和DOM对象的各个方面,包括如何访问node节点.本章我们将讲解如何通过DOM操作元素并且讨论浏览器事件模型. 本文参考:http://net.tu ...

  8. 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现(推荐)

    介绍 本章是关于ECMAScript面向对象实现的第2篇,第1篇我们讨论的是概论和CEMAScript的比较,如果你还没有读第1篇,在进行本章之前,我强烈建议你先读一下第1篇,因为本篇实在太长了(35 ...

  9. 深入理解JavaScript系列(16):闭包(Closures)

    介绍 本章我们将介绍在JavaScript里大家经常来讨论的话题 —— 闭包(closure).闭包其实大家都已经谈烂了.尽管如此,这里还是要试着从理论角度来讨论下闭包,看看ECMAScript中的闭 ...

  10. 深入理解JavaScript系列(15):函数(Functions)

    介绍 本章节我们要着重介绍的是一个非常常见的ECMAScript对象——函数(function),我们将详细讲解一下各种类型的函数是如何影响上下文的变量对象以及每个函数的作用域链都包含什么,以及回答诸 ...

随机推荐

  1. 转圈游戏(codevs 3285)

    题目描述 Description n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 ...

  2. ActionBarSherlock的使用——(一)配置

    小弟照着上面的去做,后来样式不一致,发现是用了虚拟机的缘故(虚拟机版本,API-8 2.2);就行了. 还有下面的第二步: 2.打开Eclipse,选择:FIle——New——Project——And ...

  3. .net学习笔记---HttpHandle与HttpModule

    问题1:什么是HttpHandler? 问题2:什么是HttpModule? 问题3:什么时候应该使用HttpHandler什么时候使用HttpModule? 答案1:HttpHandler,Http ...

  4. InnoDB引擎的索引和存储结构

    在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的.而MySql数据库提供了多种存储引擎.用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据 ...

  5. WordPress主题制作函数

    WordPress基本模板文件 一套完整的WordPress模板应至少具有如下文件: style.css: CSS(样式表)文件 index.php: 主页模板 archive.php: Archiv ...

  6. 测试服务API的_苏飞开发助手_使用说明

    1 工具说明_json对象字符串拼接 2 工具说明_纯字符串拼接

  7. Android的四大组件

    Android的四大组件:Activity.Service.BroadcastReceiver.Content Provider. Content Provider 属于Android应用程序的组件之 ...

  8. LightOJ 1079 Just another Robbery 概率背包

    Description As Harry Potter series is over, Harry has no job. Since he wants to make quick money, (h ...

  9. 第五根k线

    无论是下落还是上涨的一波,到第五根k线就要注意了.要么加速,不然就要翻转了

  10. javascript优化--10模式(设计模式)01

    单体模式:保证一个特定类仅有一个实例;即第二次使用同一个类创建新对象时,应该得到与第一个所创建对象完全相同对象: 在JS中,可以认为每次在使用对象字面量创建对象的时候,实际上就在创建一个单体: 当使用 ...