zoukankan      html  css  js  c++  java
  • javascript闭包,作用域,自调用匿名函数

    一,自调用匿名函数

    有两种方式:
           第一种: (function(参数){....}(传入参数))    --->括号内的语句被强制执行

          

     第二种: (function(参数){...})(传入参数)     --->说明:jquery就是采用这种方式,这种方式的原理:  原来我们调用函数的方式是,先定义,在进行函数名调用
            function funName(){
            alert("hello world");
            }
            funName(); //调用
            其原理是通过函数名(引用)去找实际的函数定义,  那么我们这种自调用就很好理解了,是一定义函数就使用,而不是通过函数名去找定义
            即如果 你使用 (function(参数){...})的形式, 则相当于你定义了一个函数并执行了定义, 之后使用(参数),即是再进行自调用,即类似   函数名(参数) ,只不过这里没有函数名,而是变成函数定义实体,直接传入参数即可
           

    自调用匿名函数作用:    使内部变量不会与外部用户自定义的全局变量产生冲突,例如一个函数重名问题:如果不是自调用的函数,那么必须有函数名,并且暴露给外部用户调用,那么就有可能产生函数重名问题:用户的自定义了一个相同的函数名称


    自调用函数的形式研究: 在js中, "()"可以强制执行,第二种可以将函数括号换为其他类型, 例如-,+,new 等等,只要是能够进行通顺运算的(会把函数定义当成一个变量的方式执行起来)【-,+,new是可以直接放在变量前面的,如果是*则需要在*前加数字才通顺 例如1*varName】




    二,作用域:

    对象变量


      1. 变量前有this:即this.varName的形式:公有变量,可以直接访问
      2.对象前没有this:私有变量或者全局变量,,无法直接访问


      1).私有变量:在对象内以var定义的变量, 如: var varName='xxxx', 不能直接访问, 需要setter和getter函数访问


      2). 全局变量: 在对象外部的变量 或者 在函数内部直接使用变量名的形式,即没有var或this的形式, 例如 varName="这是全局变量", 这样子就定义了一个全局变量

    全局变量不能以 对象.变量的形式访问, 但是可以直接以 变量名的形式访问, 例如在程序中要访问可以: alert(varName);即输出"这是全局变量"
    成员函数


      1. 函数前加this: 即 this.functionName的形式:公共函数,可以直接访问,setter和getter方法即用这样定义


      2.对象前没加this: 即function functionName(){}的形式,私有函数,只能在对象内部使用

    成员函数如何访问对象变量:


      1,对象公共变量: 本身不用返回外部也可取到, 如果要访问,使用this.varName(因为在对象中就是这样定义的)


      2.全局变量: 直接使用返回 varName的形式(因为本身就可以在任何地方使用 varName的形式)


      3.私有变量: 也是返回 varName的形式,不能使用this,this代表当前函数
    三,闭包:
      function Person(){
      var i = 1;
      function functionName(){
        alert(++i);
      }
      return functionName;
    }
    var result = Person();
    result();//得到2
    result(); //得到3
    说明:闭包:functionName称为闭包,网上通俗解释为 函数中的函数
    我更愿意理解为   对象中的函数,在作用域里讲过, 通过function functionName(){}的方式定义的是私有成员函数,只能给对象内部使用;
    要是愿意,完全可以将 return functionNname 的functionName 替换为原 functionName函数的定义,效果一样
    而在调用端, var result=Person(); 实例化对象(可以使用new Person()),result() 是调用对象,而实例化的对象只有一个,当然每调用一次i值就会增加

    如果,实例化两个对象,那么其实两个对象的i值是不会互相影响的


    四,js原型,prototype<略>


    通过 对象.prototype.XXX 可以给原有的对象 增加成员或者修改成员,(给对象进行扩展和修改),也是js中一个比较重要的知识点


    掌握了上述的四个知识之后,就可以尝试去看看JQuery库的源码了,jquery通过自调用将jQuery【$】赋给window.jQuery,并在这个对象定义了很多成员和扩展,因此我们客户端才可以直接通过 [window.]jQuery或$的方式使用JQuery库和其里面的方法
    ---------------------


  • 相关阅读:
    Tongue Twister之scream
    把5页的内容变成2页
    Python3 字符串中的变量替换
    notepad++同时编辑多行
    获取元素属性值
    selenium定位H5表单验证的提示语
    POJ 3009 Curling 2.0(dfs)
    CCF 2016122 工资计算
    POJ 2976 Dropping tests(01分数规划二分(最大化平均值))
    POJ 2155 Matrix(二维树状数组)
  • 原文地址:https://www.cnblogs.com/data-captain/p/9861274.html
Copyright © 2011-2022 走看看