首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

变量不能全局使用jQuery,需要在函数内部定义,为什么?

变量不能全局使用jQuery,需要在函数内部定义的原因是因为jQuery使用了立即执行函数表达式(Immediately Invoked Function Expression,IIFE)来封装自身的代码。这种封装方式可以避免全局命名空间的污染,并且可以防止与其他JavaScript库或代码发生冲突。

在jQuery的代码中,它会创建一个匿名函数并立即执行,这个匿名函数内部定义了一个局部作用域。在这个局部作用域中,jQuery定义了自己的变量和函数,并且将它们添加到jQuery对象上。这样做的好处是,jQuery的变量和函数只在自己的作用域内有效,不会影响到全局作用域中的其他变量和函数。

因此,如果我们在函数内部定义一个变量,它只在该函数内部有效,无法在函数外部访问。这是因为变量的作用域仅限于定义它的函数内部。如果我们希望在其他函数或全局作用域中使用这个变量,就需要将它作为函数的返回值或参数传递出来。

总结起来,变量不能全局使用jQuery,需要在函数内部定义的原因是为了避免全局命名空间的污染,保证代码的独立性和可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

c语言局部变量全局变量、静态变量内部函数、外部函数、声明、定义、extern作用总结

一、先搞一波概念 变量按作用域分: 1.局部变量: (1)在函数的开头定义(如定义形参)。   (2)在函数内部定义(如在函数里面定义变量)。   ...(3)在函数内部的复合语句定义(如for循环,花括号内)。   前两种方式定义变量可以在函数内任何地方使用,而第三种方式定义变量只能在复合语句内使用。...2.全局变量函数之外定义变量称为全局变量,也称为外部变量,其作用域为从定义变量的位置开始到本源文件结束。...说明:  (1)因为函数只能返回一个返回值,因此可以通过使用全局变量来实现一个函数改变多个值后,还能被其他函数调用。   ...(3)在外部变量前面加static修饰符,可将外部变量限制在本文件中。这里有一个坑,如果变量为static全局变量,在函数不能扩张其作用域,必须在函数外声明以达扩张效果(包括主函数)。

5.9K83

【深入浅出jQuery】源码浅析--整体架构

jQuery 中,只有全局都会用到的变量、正则表达式定义在了代码最开头,而每个模块一开始,又会定义一些只在本模块会使用到的变量、正则、方法等。...道理说了很多,接来下进入真正的正文,对 jQurey 的一些前期准备,小的细节进行分析:  jQuery 闭包结构 // 用一个函数域包起来,就是所谓的沙箱 // 在这里边 var 定义变量,属于这个函数域内的局部变量...{ // jQuery 代码 })(window); jQuery 具体的实现,都被包含在了一个立即执行函数构造的闭包里面,为了不污染全局作用域,只在后面暴露 $ 和 jQuery 这 2 个变量给外界...) { // 判断全局 $ 变量是否等于 jQuery 变量 // 如果等于,则重新还原全局变量 $ 为 jQuery 运行之前的变量(存储在内部变量 _$ 中) if (window...那么让出了这两个符号之后,是否就不能在我们的代码中使用 jQuery 或者呢 $ 呢?

65441
  • JavaScript 匿名函数几种执行方式

    ,当时不知道为什么要加括号,后来明白,要在函数体后面加括号就能立即调用,则这个函数必须是函数表达式,不能函数声明。...javascript中没用私有作用域的概念,如果在多人开发的项目上,你在全局或局部作用域中声明了一些变量,可能会被其他人不小心用同名的变量给覆盖掉,根据javascript函数作用域链的特性,可以使用这种技术可以模仿一个私有作用域...,用匿名函数作为一个“容器”,“容器”内部可以访问外部的变量,而外部环境不能访问“容器”内部变量,所以( function(){…} )()内部定义变量不会和外部的变量发生冲突,俗称“匿名包裹器”或...JQuery使用的就是这种方法,将JQuery代码包裹在( function (window,undefined){…jquery代码…} (window)中,在全局作用域中调用JQuery代码时,可以达到保护...JQuery内部变量的作用。

    91230

    再谈模块化

    模块 模块是比对象和函数更大的代码单元。使用模块可以将程序进行归类。为什么需要模块?...在有些时候,js中可能都是全局变量(如果你在主线程代码中定义变量,该变量会被自动识别为全局变量),并且可被其他部分的代码访问。当,程序开始扩展,引入第三方代码后,命名冲突的可能性就会大大提高。...,因为扩展的函数和原有模块里的模块私有函数是处在不同的环境中定义,不可以访问对方的内部变量。...同时,不需要使用立即执行函数包装变量。而是使用module.exports 在模块中定义变量都是安全地包含在当前模块中,不会泄露到全局作用域。...同时,只需要使用require函数引用模块。 CMD是NodeJS默认的模块格式。 CMD缺点 不能显式支持浏览器。

    46220

    前端面试官问闭包,怎样回答脱颖而出

    ——《JavaScript高级程序设计》 2.为什么使用闭包? 原因:Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。 但是在函数外部自然无法读取函数内的局部变量。...出于种种原因,我们有时候需要得到函数内的局部变量。那就是在函数内部,再定义一个函数。 3.你能写一个闭包出来吗?...优点:简单好用; 缺点:闭包使用不当可能造成内存泄露; 因为闭包中引用到的包裹函数定义变量永远不会被释放,所以我们应该在必要的时候,及时释放这个闭包函数。 7.内存泄露是什么?...1,在退出函数之前,将不使用的局部变量赋值为null; 2,避免变量的循环赋值和引用。 3,利用Jquery释放自身指定的所有事件处理程序。...8.使用闭包的注意点 1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。

    22510

    【THE LAST TIME】深入浅出 JavaScript 模块化

    ,就直接 module1.fun2(); 优点 一定程度上优化了命名冲突,降低了全局变量污染的风险 有一定的模块封装和隔离,并且还可以进一步语义化一些 缺点 并没有实质上改变命名冲突的问题 外部可以随意修改内部成员变量...); }()); // 控制台显示:'You failed 2 times.' // 控制台显示:'Hello, I am a global variable :)' 这种方法的好处在于,你可以在函数内部使用局部变量...根据规范,每一个文件既是一个模块,其内部定义变量是属于这个模块的,不会污染全局变量。...假设underscore并没有使用 RequireJS定义,但是你还是想通过RequireJS来使用它,那么你就需要在配置中把它定义为一个shim deps——加载依赖关系数组 require.config...一个模块就是一个单例,或者说就是一个对象 代码是在模块作用域之中运行,而不是在全局作用域运行。模块内部的顶层变量,外部不可见。

    68530

    JavaScript立即执行函数(IIFE)的使用

    1.传统的方法啰嗦,定义和执行分开写; 2.传统的方法直接污染全局命名空间(浏览器里的 global 对象,如 window) 函数范围与块范围界定 使用var关键字声明的局部变量的作用域为封闭函数。...如果不存在这样的函数,则会将变量创建为全局变量,从而污染全局范围。...IIFE来返回一个”封闭”一些本地变量来管理私有数据的函数时,let和const都不能替代它。...变量重命名 有时,你可能碰到一种情况,你正在使用的两个不同的库暴露的全局变量名是相同的。例如,考虑一下你正在使用jQuery同时另一个库也指定了一个为$的全局变量。...为了解决命名冲突问题,可以将一段代码封装在一个IIEF中,将一个全局变量(比如,jQuery)作为参数传入IIFE。

    2.3K20

    深入浅出理解闭包

    这个“代码段”其实分三种情况——全局代码,函数体,eval代码。 这里解释一下为什么代码段分为这三种。 所谓“代码段”就是一段文本形式的代码。...另外一点不同在于,函数定义的时候(不是调用的时候),就已经确定了函数内部自由变量的作用域。至于“自由变量”和“作用域”是后面要专门拿出来讲述的重点,这里就先点到为止。...所以,我们在声明变量时,全局代码要在代码前端声明,函数要在函数体一开始就声明好。除了这两个地方,其他地方都不要出现变量声明。而且建议用“单var”形式。...说到这里,咱们又可以拿出jquery源码来讲讲了。 jQuery源码的最外层是一个自动执行的匿名函数: image.png 为什么要这样做呢?...原因就是在jQuery源码中,声明了大量的变量,这些变量将通过一个函数被限制在一个独立的作用域中,而不会与全局作用域或者其他函数作用域的同名变量产生冲突。

    72720

    手摸手打造类码上掘金在线IDE(三)——沙箱环境

    IIEF 我们知道,在浏览器中有一个window,我们的变量声明会或多或少的影响全局环境 但是人们发现,由于函数的特殊作用通过闭包的方式,可以将多余的变量,保存在闭包中,只留下个别变量挂在全局,并且全局...他的作用就是JavaScript 查找某个未使用命名空间的变量时,会通过作用域链来查找,作用域链是跟执行代码的 context 或者包含这个变量函数有关。'...传入的的变量内部的成员的的代码 //而你在code中传入的全局方法console.log 就会被拦截从而报错 // 从而保证code代码执行的干净纯洁...1、你在code中执行的log 函数,还是能访问到全局内容,所以,所谓沙箱形同虚设,他也只是能隔离code代码中的一些变量 2、由于Proxy 的拦截限制,多层拦截,就凉了 所以,这个所谓的沙箱模式,...并不能再真正的项目上投入使用,他也只是人们的探究而已 于是随着技术的发展,微前端出现,大大推动了沙箱模式的进化,因微前端是给两个项目攒到一块,所以必须实现全局window 的隔离 ,于是大佬们又开始了折腾之路

    81820

    PHP丨PHP基础知识之PHP基础入门——函数「理论篇」

    二、PHP中变量的作用域 image.png 1、局部变量:声明在函数内部变量,称为局部变量。只在函数内部能用,函数外加使用函数使用return关键字返回。...2、全局变量:声明的函数外部的变量,称为全局变量。 3、函数中,使用变量,默认使用内部局部变量。如果,函数使用全局变量,需要使用global关键字,将全局变量引用函数,才能使用。...$GLOBALS["a"] = 10; ---> echo $GLOBALS["a"];//任何位置直接使用 5、函数使用全局变量,还有一种方式:通过给函数传参,可以在函数内部使用全局变量; 但是,传递以后的参数是函数的局部变量...除非,传递的参数是地址function func($a1,&$a2){} //函数内部修改a1,则全局a1不会变,函数内部修改a2,则全局a2会变。...如果函数的形参,出现了取址符号,则,调用函数时,实参必须是变量,而不能是字面量。 6、使用require与include包含不会影响作用域。

    1.1K11

    前端必备,25个最基本的JavaScript面试问题及答案

    内部函数中, this 不再指向 myObject。其结果是,this.foo 没有在内部函数中被定义,相反,指向到本地的变量self 保持在范围内,并且可以访问。...(在ECMA 5之前,在内部函数中的this 将指向全局的 window 对象;反之,因为作为ECMA 5,内部函数中的功能this 是未定义的。)...闭包是一个可以访问外部(封闭)函数作用域链中的变量内部函数。闭包可以访问三种范围中的变量:这三个范围具体为:(1)自己范围内的变量,(2)封闭函数范围内的变量,以及(3)全局变量。...在JavaScript中,闭包是作为一个“内部函数”实施的:即,另一个函数主体内定义函数。闭包的一个重要特征是,内部函数仍然有权访问外部函数变量。...因此,在本例中,由于 x未在函数内部定义,因此在外部函数范围中搜索定义变量 x,且被发现具有1的值。

    92930

    教你开发jQuery插件(转) 教你开发jQuery插件(转)

    :$('a'),则this=$('a') this.css('color', 'red'); } 在插件名字定义的这个函数内部,this指代的是我们在调用该插件时,用jQuery选择器选中的元素...如果将需要的重要变量定义到对象的属性上,函数变成对象的方法,当我们需要的时候通过对象来获取,一来方便管理,二来不会影响外部命名空间,因为所有这些变量名还有方法名都是在对象内部。...所以不到万不得已,一般我们不会将变量定义全局的。 一个好的做法是始终用自调用匿名函数包裹你的代码,这样就可以完全放心,安全地将它用于任何地方了,绝对没有冲突。...如上面我们定义了一个Beautifier全局变量,它会被附到全局的window对象上,为了防止这种事情发生,你或许会说,把所有代码放到jQuery的插件定义代码里面去啊,也就是放到$.fn.myPlugin...变量定义:好的做法是把将要使用变量名用一个var关键字一并定义在代码开头,变量名间用逗号隔开。

    3.3K10

    献给前端求职路上的你们(下)

    console.log(x+y+(++num)); } } aa函数中的bb函数就是闭包了,bb函数可以使用aa函数的局部变量,参数,最典型的闭包应该是下面这样,将定义函数中的函数作为返回值...JavaScript的作用域指的是变量的作用范围,内部作用域由函数的形参,实参,局部变量函数构成,内部作用域和外部的作用域一层层的链接起来形成作用域链,当在在函数内部要访问一个变量的时候,首先查找自己的内部作用域有没有这个变量...//undeifned var num=2; console.log(num); //2} aa(); 为什么在aa函数中会出现上述结果呢,这就是JavaScript的变量提升了,虽然变量num...的定义在后面,不过浏览器在解析的时候,会把变量定义放到最前面,上面的aa函数相当于 function aa(){ var num; console.log(num); //undefined...(5) 少用全局变量、缓存DOM节点查找的结果。减少IO读取操作。 (6) 避免使用CSS Expression(css表达式)又称Dynamic properties(动态属性)。

    1.1K60

    JS模块化编程以及AMD、CMD规范、Webpack

    虽然这个模式的写法比较难看,但是,它同时兼容了AMD和CommonJS,而且还支持老式的全局变量规范。 什么是JS模块化 先想一想,为什么模块很重要?...所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。...参考:https://www.jianshu.com/p/fb479435eba0 Require.js的使用 Require提供的全局变量和方法: define  是用来定义一个模块,只有实现了模块定义的...jquery没有加载成功后,会加载本地js目录下的jquery使用requirejs时,加载模块时不用写.js后缀的,当然也是不能写后缀 上面例子中的callback函数中发现有$参数,这个就是依赖的...定义模块,比如hello.js: function sayHello() { alert("hello"); } 我们要使用shim ,将某个依赖中的某个全局变量暴露给requirejs,当作这个模块本身的引用

    2.3K10

    前端开发中不可忽视的知识点汇总(二)

    全局函数无法查看局部函数内部细节,但局部函数可以查看其上层的函数细节,直至全局细节。...默认支持的糟糕特性都会被禁用,比如不能用with,也不能在意外的情况下给全局变量赋值; 全局变量的显示声明,函数必须声明在顶层,不允许在非函数代码块内声明函数,arguments.callee也不允许使用...特别html会出现") (5)使用对象字面量替代 new Array 这种形式 (6)绝对不要在一个非函数块里声明一个函数,把那个函数赋给一个变量。...浏览器允许你这么做,但是它们解析不同 (7)不要使用全局函数 (8)总是使用 var 来声明变量,如果不这么做将导致产生全局变量,我们要避免污染全局命名空间 (9)Switch 语句必须带有 default...闭包使用的优缺点 优点:1.保护函数内部变量的安全,加强了封装性 2.在内存中维持一个变量 3.设计私有方法和变量 4.可以读取函数内部变量 缺点:1.导致内存泄漏,使用不当会造成额外的内存占用 2.

    1.7K40

    金九银十求职季,前端面试大全送给你

    不用全局函数 switch必须有default 17、定义函数 函数声明 function name(){} 函数表达式 var name = function(){} new实例化(不常用)...闭包特性 闭包是指有权访问另一个函数作用域中变量函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部变量和方法传递到外部...特性: - 函数内再嵌套函数 - 内部函数可以引用外层的参数和变量 - 参数和变量不会被垃圾回收机制回收 26、什么是js严格模式 严格模式就是在js代码前加 use strict 让 Javascript...内部主要是微信自己定义的一套组件。...但是这个文件创建一下就行 什么都不需要写以后我们可以在这个文件中监听并处理小程序的生命周期函数、声明全局变量

    1.4K20

    jQuery插件开发全解析

    关于类级别的插件开发可以采用如下几种形式进行扩展: 1.1 添加一个新的全局函数 添加一个全局函数,我们只需如下定义: Js代码 jQuery.foo = function() { alert(...This is only a test.'); }; 1.2 增加多个全局函数 添加多个全局函数,可采用如下定义: Js代码 jQuery.foo = function() { alert...虽然在jQuery命名空间中,我们禁止使用了大量的javaScript函数名和变量名。...但是仍然不可避免某些函数变量名将于其他jQuery插件冲突,因此我们习惯将一些方法封装到另一个自定义的命名空间。...一个通理是,如果你不能肯定是否暴露特定的函数,那么你也许不需要那样做。 那么我们怎么定义更多的函数而不搅乱命名空间也不暴露实现呢?这就是闭包的功能。

    1.1K70

    浅谈js的内存与闭包

    结论:js执行顺序,先定义,后执行,从上到下,就近原则。闭包可以让外部访问某函数内部变量,而且会导致内存泄漏。...好的,那为什么var优先? 先定义后执行,先去栈查找 变量提升,其实也是如此。...为什么就近原则?都确定函数内部定义了,就不会再去外面白费力气。...对于js各种库,是一个庞大的IIFE包裹着,如果他被垃圾回收了,我们肯定不能利用了。而我们实际上就是能利用他,就是因为他暴露了接口,使得全局环境保持对IIFE内部函数变量的引用,我们才得以利用。...但也许全局变量在某个时候开始就没有作用了,就不能被回收,造成了内存泄漏。所以又引出另一个常见的注意事项:不要过度利用闭包。用得越多,栈越深,变量不能被回收。

    46320
    领券