今天在写表单验证的时候,发现一个关于变量作用域的问题。
很多人都在纠结局部变量与全局变量的问题,其实全局变量与局部变量就是差别在作用域与生命周期两方面。
但是全局变量是魔鬼阿!过多的全局变量会造成变量覆盖!(重名的话后声明的会覆盖先声明的变量)
话不多说,咱们从一个例子来看!
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>关于全局变量与局部变量</title> </head> <body> <form> <input type="password" id="psw1" /> <input type="password" id="psw2" /> <input type="button" id="send" value="验证" /> </form> <script type="text/javascript" src="../../resources/js/base/jquery-1.8.3.min.js"></script> <script type="text/javascript" src="../../resources/js/page/test.js"></script> </body> </html>
方法1:全局
var psw1 = $('#psw1').val(); var psw2 = $('#psw2').val(); $(function testpsw() { $('#send').click(function() { if (psw1 == psw2) { alert('输入正确'); } else{ alert('输入错误'); } }); })
方法2:局部
$(function testpsw() { $('#send').click(function() { var psw1 = $('#psw1').val(); var psw2 = $('#psw2').val(); if (psw1 == psw2) { alert('输入正确'); } else{ alert('输入错误'); } }); })
我定义了2个input,我需要做的就是验证这两个input的value是否相同。相同就报OK,不同就报不Ok。
两个的结果分别是
方法1:(无论我输入什么都是错误的)
方法2:(两个input的value一样时正确,不一样时错误)
为什么会这样呢?
之所以两者会不一样,是因为作用域的问题。当我们沿用第一种做法的时候。我们在testpsw()中调用的就是全局变量。而第二种中我们调用的就是局部的变量。在function这个块里面,当我们触发事件时,psw1与psw2已经发生变化。然后垃圾收集。局部变量在函数执行完就就没有存在的必要了。而全局变量的值等于先前已经获取过了input的value,不会随着我们的更改而改变。
简而言之,就是全局定义的这个变量,已经有了固定的值不会随着我们更改input的value改变。它会一直存在。
而局部变量,每次我们点击验证按钮时,都会刷新两个变量的值。每次获取到我们输入的新的值。因为它每次执行完点击事件触发后,这个变量就会销毁。每次都会重新定义!
其中这还涉及到了关于全局变量与局部变量更多的内容,也设计到了垃圾回收机制!
剩下的内容会在随后介绍!
相关推荐
在上述内容中,作者遇到了一个常见的编程问题:全局变量作用域问题。尽管在AJAX的success函数里修改了全局变量status的值,但由于JavaScript的异步执行特性,AJAX请求的响应可能在alert(status)之后才被处理。因此,...
- 如果函数内部声明的变量与全局变量同名,局部变量会覆盖全局变量。 - 局部变量在其函数执行完毕后会被销毁(除非涉及闭包)。 #### 三、作用域链 1. **作用域链的概念** - 在JavaScript中,每个执行上下文都有...
在JavaScript中,全局变量和局部变量的区分是非常关键的,而页面元素(如DOM元素)的访问则有其特定规则。 首先,JavaScript有两种主要的变量类型:全局变量和局部变量。全局变量在整个程序中都可被访问,而局部...
- 变量冲突:在大型项目中,不同模块之间可能定义相同名称的全局变量,导致命名冲突。 因此,最佳实践是尽量避免使用全局变量,除非必要。优先考虑使用局部变量,或者通过模块系统(如ES6的`export`和`import`)来...
`json.js`可能是一个用于处理JSON数据的JavaScript库,而与jQuery冲突的问题通常出现在两个库都尝试使用相同的全局变量或者方法名。 在JavaScript中,JSON主要用于序列化和解析数据对象,使得数据可以在客户端和...
这样的声明方式可以清楚地表示出该变量属于全局作用域,而且可以避免与局部变量产生冲突。 这三种方式在一般情况下可能表现得没有区别,例如,我们直接使用变量test时,无论采用哪种方式声明,其结果都是一样的: `...
3. **使用局部变量**:在全局作用域内设置一个标志变量,首次触发 `pageinit` 时将其设为已处理,之后每次触发时检查该变量以决定是否执行初始化代码。 **二、页面跳转后样式丢失和 JavaScript 失效** 在 jQuery ...
在闭包的使用中,外部函数返回内部函数,而内部函数能够访问外部函数的局部变量,包括传递给闭包的jQuery对象。这样,就可以在闭包内部自由编写插件的功能代码,而不会与其他代码发生冲突。 在实际开发中,一个功能...
3. **使用IIFE(Immediately Invoked Function Expression)**:另一种避免冲突的方法是将ECSHOP的JavaScript代码包裹在一个立即执行的函数表达式中,这样可以创建一个局部的作用域,防止全局变量污染。 4. **插件...
在 1.2.6 版本中,`$` 是一个立即执行的函数表达式(IIFE),它创建了一个局部作用域,避免了全局变量污染。`$` 函数接受两个参数:一个选择器和一个回调函数。如果选择器是字符串,它会尝试匹配 DOM 元素;如果选择...
8. **效率优化**:在使用jQuery时,应注意性能优化,如减少DOM操作次数,使用高效的selector,避免使用全局变量,以及利用缓存机制提高性能。 9. **兼容性**:jQuery 1.4.1版本对当时的主流浏览器(如IE6/7/8、Fire...
这个例子展示了如何在一个匿名函数中使用 `jQuery`,并且避免了与全局变量 `str` 的直接交互。对比下面的全局变量操作,我们可以看到局部作用域的效率和安全性优势: ```javascript var str = "全局字符串..."; ...
3. **作用域**:理解全局作用域和局部作用域,以及 ES6 引入的块级作用域,对于变量管理非常重要。 4. **函数**:掌握函数的基本用法,如函数表达式、箭头函数、函数参数等。 5. **对象和原型链**:深入理解 ...
在学习JavaScript时,你需要理解变量的声明(var、let、const)、数据类型(基本类型和引用类型)、作用域(全局、局部、块级)以及闭包等概念。同时,掌握控制流(条件语句、循环)和函数(声明式、匿名、箭头函数...
对于已有的全局变量,应该谨慎使用,避免在不同作用域中进行重复定义,从而减少不必要的bug和潜在的维护问题。如果非要使用全局变量,建议采用全局命名空间的方式,将相关的全局变量聚集在一个对象下,例如MyApp_var...
jQuery是一个广泛使用的JavaScript库,其...它的架构设计考虑了性能优化,如局部变量和参数的使用,以及避免全局作用域污染。通过对源码的深入理解,开发者可以更好地利用jQuery,或者在自己的项目中借鉴其设计模式。
5. **局部变量**:在`.ajax()`的设置对象中,可以通过`context`参数指定回调函数的上下文,这样在回调中可以访问到正确的`this`值。 四、jQuery的其他AJAX方法 除了$.ajax(),jQuery还提供了简化的$.get(), $.post...
全局变量会占用内存且可能导致命名冲突,尽量使用局部变量或闭包来管理变量。 七、使用最新的jQuery版本 新版本通常包含性能改进和修复,保持更新能获取最佳性能。 综上,通过对选择器、DOM操作、事件处理、动画和...
- **避免全局变量**: 尽量将jQuery对象存储为局部变量,减少全局污染。 学习jQuery不仅可以提高开发效率,还能使代码更加简洁、优雅。结合C# ADO.NET,可以构建出高效且具有强大交互性的Web应用。在实践中不断探索...
这个“jQuery.js资源引用包”正是为编程Java开发者提供了一个方便的库,使得在JavaWeb项目中集成jQuery成为可能。 1. **jQuery的核心特性** - **选择器(Selectors)**: jQuery借鉴了CSS的选择器语法,使得选取DOM...