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库和其里面的方法
---------------------


posted @ 2018-10-27 15:01  等冷等冷  阅读(385)  评论(0编辑  收藏  举报