有关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. HDU 5754 Life Winner Bo (各种博弈) 2016杭电多校联合第三场

    题目:传送门 题意:一个国际象棋棋盘,有四种棋子,从(n,m)走到(1,1),走到(1,1)的人赢,先手赢输出B,后手赢输出G,平局输出D. 题解:先把从(n,m)走到(1,1)看做是从(1,1)走到 ...

  2. HDU 1521 排列组合 指数型母函数

    排列组合 Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status D ...

  3. 如何关闭ie9烦人的提示信息?

    ①Q:如何关闭“IE 限制活动内容”的提示? A:去掉“IE 限制活动内容”的提示: 1. 找到IE的“Internet选项”: 2. 选择“高级”选项卡: 3. 在“设置”下,找到子标题“安全”,将 ...

  4. (二)STM32中中断优先级理解

    很多人在配置STM32中断时对固件库中的这个函数NVIC_PriorityGroupConfig()——配置优先级分组方式,会很不理解,尤其是看中文翻译版的,因为中文翻译版里把这里翻译成“先占优先级和 ...

  5. 【读书笔记】读《JavaScript模式》 - 函数复用模式之类式继承模式

    实现类式继承的目标是通过构造函数Child()获取来自于另外一个构造函数Parent()的属性,从而创建对象. 1.类式继承模式#1 —— 默认方式(原型指向父函数实例) function Paren ...

  6. Diablo3

    1.装备 主手:元素弓 副手:精细箭袋 头: 胸:燃火外套 手:娜塔亚的手感 护腕:稳击护腕 戒指:罗盘玫瑰+布尔凯索的婚戒 颈部:旅者之誓 腰:科雷姆的强力腰带(速度加25%) 腿:深渊挖掘裤 脚: ...

  7. hdu 1009:FatMouse' Trade(贪心)

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  8. C#学习笔记——Show()与ShowDialog()的区别

    用Show()调用的窗体不会返回任何值,在使用form.Show()显示form以后,会马上继续执行form.Show()后面的语句.而用ShowDialog()调用的窗体会返回一个DialogRes ...

  9. andorid开发易范的错误

    1 写DAO,调用远程API接口返回不来数据,实际这个api接口经过第三方工具测试通过的,原因是没有放到线程里.

  10. zookeeper 4 letter 描述与实践

    命令示例描述 Conf echo conf | nc localhost 2181 (New in 3.3.0)输出相关服务配置的详细信息.比如端口.zk数据及日志配置路径.最大连接数,session ...