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

原文:https://blog.csdn.net/dansam/article/details/41567007
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/data-captain/p/9861274.html

时间: 2024-10-06 07:08:59

javascript闭包,作用域,自调用匿名函数的相关文章

JS函数 -- 功能,语法,返回值,匿名函数,自调用匿名函数,全局变量与局部变量,arguments的使用

“JavaScript设计得最出色的就是它的函数的实现.” -- <JavaScript语言精粹> 函数包含一组语句,它们是JS的基础模块单元,用于指定对象的行为.一般来说,所谓编程,就是将一组需求分解成一组函数与数据结构的技能. 1.函数的功能 代码重复性使用 模块化编程 2.语法: 使用函数前要先定义才能使用 函数定义有三个部分:函数名,参数列表,函数体 格式: 1 function 函数名([参数1, 参数2, ...]){ 2 3 函数执行部分; 4 5 return 表达式; 6 7

自调用匿名函数

通常定义函数并调用 function a(){ } a(); 或是 var a = function(){ } a(); 但是查看jquery源码会发现它最外层的架构是这样的 (function( window, undefined ) { // jquery code })(window); 解释:首先jquery是定义了一个匿名函数(所谓的匿名函数就是没有名字的函数,顺便说一下闭包的概念:闭包就是在一个函数内部定义一个函数指向外部函数的一个成员变量,并且内部定义的这个函数访问外部函数中定义的

通过取父级for循环的i来理解闭包,iife,匿名函数

在使用for循环的时候,假如需要在循环体中添加一个匿名函数处理其他的事情,那么,在这个匿名函数内,如果需要用到对应的i,因为闭包的缘故,循环体循环结束后才返回i,所以i最终为最后一次++的数值. 闭包即函数有权访问另一函数的局部变量,常用方法为在函数内部创建另一个需要引用这个函数内部变量的函数. 解决方式1 通过匿名函数传参,因为匿名函数取得参数是每次for循环里的i,所以每次打印的值为0,1,2,...... 匿名函数自我执行的方法是,在函数体外套一对圆括号,形成一个表达式,在圆括号后再加另一

Javascript中的自执行匿名函数(个人理解也叫立即执行的匿名函数)的理解

格式: (function(){ //代码 })(); 包围函数(function(){})的第一对括号向脚本返回未命名的函数,随后一对空括号立即执行返回的未命名函数,括号内为匿名函数的参数. (function(arg){ alert(arg+100); })(20); // 这个例子返回120. 回来看看jquery的插件编写 (function($) { // Code goes here })(jQuery); 这样代码等同于 var a=functon($) {//code }; a(

JavaScript作用域、上下文环境、函数对象的定义与调用、匿名函数的定义与调用、闭包

提到闭包总给人很高深的感觉,网上的例子也数不胜数.但是我发现相当一部分并不容易理解.根据我的观察,是因为这些例子把标题中提到的概念糅杂在了一起,往往越看越糊涂.所以我希望化整为零,拆成简单例子来解释. 1.先看作用域: JavaScript作用域只有两种--全局作用域和函数内作用域,没有代码块作用域.示例: function loop(){ for(var i=0;i<5;i++){ //doSomething; } alert(i); } loop(); //执行函数结果为5. 尽管变量i已经

JavaScript中的闭包与匿名函数

知识内容: 1.预备知识 - 函数表达式 2.匿名函数 3.闭包 一.函数表达式 1.定义函数的两种方式 函数声明: 1 function func(arg0, arg1, arg2){ 2 // 函数体 3 } 函数表达式: 1 var func = function (arg0, arg1, arg2){ 2 // 函数体 3 } 2.注意事项 函数表达式使用前必须赋值!像下面的代码是错误的: 1 say() 2 var say = function(){ 3 console.log("12

js匿名函数及闭包(javaScript高级程序设计第3版)

一.匿名函数 //普通函数 function box() { //函数名是box return 'Lee'; } //匿名函数 function () { //匿名函数,会报错 return 'Lee'; } //通过表达式自我执行 (function box() { //封装成表达式 alert('Lee'); })(); //()表示执行函数,并且传参 //把匿名函数赋值给变量 var box = function () { //将匿名函数赋给变量 return 'Lee'; }; aler

匿名函数与闭包

1.匿名函数: 普通函数   function box(){return "lee";}   //函数名是box 匿名函数   function(){return "lee";}   //匿名函数,会报错 通过表达式自我执行    (function box(){alert("lee");})();  //封装成表达式 把匿名函数赋值给变量   var box=function(){return 'lee';}; 函数里的匿名函数    func

JavaScript从作用域到闭包

作用域(scope) 全局作用域和局部作用域 通常来讲这块是全局变量与局部变量的区分. 参考引文:JavaScript 开发进阶:理解 JavaScript 作用域和作用域链 全局作用域:最外层函数和在最外层函数外面定义的变量拥有全局作用域. 1)最外层函数和在最外层函数外面定义的变量拥有全局作用域 2)所有末定义直接赋值的变量自动声明为拥有全局作用域,即没有用var声明的变量都是全局变量,而且是顶层对象的属性. 3)所有window对象的属性拥有全局作用域 局部作用域:和全局作用域相反,局部作