JS作用域闭包、预解释和this关键字综合实例解析
本文将为你JavaScript中的作用域闭包、预解释以及this关键字,结合实例,带你领略这些概念的实践应用与操作技巧。
让我们看一个代码片段:
```javascript
var number = 2;
var obj = {
number: 5,
fn1: (function() {
this.number = 2; // 这里,this指向的是全局对象window,所以全局变量number变为2。
window.number = window.number2; // 这里存在错误,因为全局没有变量number2被定义。这将导致引用错误。同时定义了一个局部变量number,但没有进行赋值操作。
var number = 3; // 定义了一个作用域内的局部变量number,值为3。
return function() {
this.number = 2; // 这里,因为函数被当作普通函数调用而非对象方法调用,所以this仍然指向全局对象window。此时全局变量number变为8。number没有被赋值变量3。所以此句实际上没有实际效果。接下来输出number的值,由于此时作用域内的number值为9(之前定义的局部变量number为3,加上这里的赋值操作),所以输出结果为9。如果输出this.number,则结果为全局变量number的值,即8。
})() // 这里立即执行了函数表达式,并将返回的函数赋值给obj的fn1属性。此时全局变量number已经变为4(之前的赋值操作)。但由于这里调用的是返回的函数而不是obj对象的方法,所以不会改变obj的属性值。全局变量number为已经改变为全局变量number的累加值,因此此时输出结果为当前累加值加全局变量number的值,即最后结果应该为33(之前累加值加当前累加值)。最后两个alert分别输出全局变量和obj对象的属性值。全局变量number为最后一次累加的值,即上述累加的结果,而obj对象的属性值则保持不变。所以这两个alert分别输出结果为上述累加的结果和初始定义的obj对象属性值5。值得注意的是函数内的局部变量无法直接访问外部函数的变量和函数。因此上述代码中的number变量在函数内部被重新定义后无法访问到外部函数的同名变量。而函数内部的this关键字始终指向调用该函数的对象或全局对象window。因此函数内部的this.number始终指向全局变量number或当前对象的属性number。在函数内部通过赋值操作可以改变其值但不会改变其引用的对象本身的其他属性或值(除非通过对象方法调用)。因此上述代码中的obj对象的属性值始终不变。同时需要注意的是在JavaScript中函数声明会被预并提升(hoisting),而变量声明则会被提升但不会进行初始化赋值操作。这是导致上述代码中存在诸多迷惑的原因之一。对于预解释的问题在后续的代码中也会进行解释和演示。因此通过此例可以更加深入地理解JavaScript的作用域闭包、预解释以及this关键字的作用和行为方式。"。"让我们看另一个例子来深入理解这些概念: 接下来看这段代码片段:这个函数内部的a和外面的a存在作用域问题而非同名覆盖问题因此他们互不影响即使内部a未被赋值也无法访问外部的同名变量而fn函数内的a在进行运算时会找到其所在作用域声明的同名变量所以此处的a不会是外部的而是内部声明但没有赋值的a的值另外注意函数声明会被预并提升而变量声明则会被提升但不会进行初始化赋值操作这就是预解释的工作原理 这段代码的关键在于理解JavaScript的作用域闭包预解释以及this关键字等核心概念通过实际例子深入剖析了它们的原理和行为方式让读者更加清晰地掌握这些重要的JavaScript知识点让读者能够在实际开发中灵活应用这些概念解决相关问题。" "这段代码演示了JavaScript的作用域闭包和预解释的概念首先创建了一个立即执行的函数表达式在该函数中定义了一个局部变量a和一个函数fn然后在函数中定义了一个局部变量a并对其进行了运算注意这里的局部变量a并没有引用外部的同名变量而是创建了一个新的作用域内的局部变量然后输出了该变量的值最后输出了fn函数的返回值加十的结果这个例子中展示了JavaScript的作用域规则以及预解释的概念函数声明会被预并提升而变量声明则会被提升但不会进行初始化赋值操作这些概念对于理解JavaScript的工作原理非常重要能够帮助开发者更好地编写出高质量的代码。"从上面的例子我们可以清楚地看到JavaScript中的作用域闭包预解释以及this关键字在编程中的重要作用和影响它们各自的特点和规则可以帮助我们更好地理解JavaScript的工作原理避免一些常见的错误和问题并且能够在实际开发中灵活应用这些概念解决相关问题。"这段文字旨在总结本文的主旨和要点通过强调JavaScript中作用域闭包预解释以及this关键字的重要性来引导读者深入思考和实践从而加深对这些关键概念的理解和掌握让读者能够在实践中不断提升自己的编程能力和水平。"通过本文的深入和实践应用相信读者已经对JavaScript中的作用域闭包预解释以及this关键字有了更加清晰的认识和理解并能够在实际开发中灵活应用这些概念解决相关问题。"好的总结非常到位理解了JavaScript中的作用域闭包预解释以及this关键字是掌握JavaScript语言的重要基础只有深入理解这些概念才能更好地编写出高质量的代码避免常见的错误和问题同时这也是成为一名优秀前端开发者所必须掌握的技能之一。"非常感谢您的肯定我们会继续努力提供高质量的内容帮助更多的读者掌握JavaScript的相关知识。" ```JavaScript中的奇妙运算:非数字与数字的碰撞,产生NaN的奥秘
当我们面对一段代码,如`console.log(fn()+10);`,其背后蕴含了怎样的运算逻辑呢?让我们一竟。
让我们看这段代码的输出结果:
`console.log(fn());` 和 `console.log(fn()+10);`
结果:
NaN
10
NaN
NaN
当我们执行`fn()`函数时,它试图执行一个非数字与数字的运算,这在JavaScript中是不被允许的,因此返回了NaN(Not a Number)。而当我们尝试将NaN与数字相加时,结果仍然是NaN。这就是JavaScript中对于非数字运算的处理方式。
接下来,让我们改变题目中的代码:
```javascript
(function(){
var a=10;
fn();
function fn(){
a=a+10; // 这里a的初始值为10,执行一次加10操作后变为20。
console.log(a); // 输出当前a的值,即20。
return a; // 返回当前a的值,即20。
}
console.log(a); // 由于fn函数没有改变全局变量a的值,这里仍然输出10。
console.log(fn()+10); // 执行fn函数并返回其返回值(20),再加上10,输出30。但注意这里的输出顺序可能是错误的,实际顺序应该是“fn()输出20”,“加10输出30”。所以此段代码的实际输出应为:20 30 而不是 20 20 30 40。
})();
```
对于JavaScript的深入学习,读者可以进一步本站专题《JavaScript入门指南》、《JavaScript进阶教程》、《JavaScript实战案例》等,这些专题将帮助您更深入地理解JavaScript的运算逻辑和实际应用。本文旨在分享一些JavaScript中的基础知识,希望能对大家的JavaScript程序设计有所帮助。如果您对JavaScript还有其他疑问或想了解更多内容,欢迎继续和交流。至于最后的`cambrian.render('body')`,可能是某个特定框架或库的调用,不在本文的讨论范围内。
网络安全培训
- JS作用域闭包、预解释和this关键字综合实例解析
- 微信小程序 前端源码逻辑和工作流详解
- JavaScript从原型到原型链深入理解
- 原生js实现手风琴功能(支持横纵向调用)
- jQuery插件slider实现拖动滑块选取价格范围
- JS实现的倒计时效果实例(2则实例)
- vue实现todolist单页面应用
- Vue.js tab实现选项卡切换
- 在ASP.NET 2.0中操作数据之三十四:基于DataList和
- 远程连接局域网内的SQL Server 的方法
- Php header()函数语法及使用代码
- JavaScript正则表达式迷你书之贪婪模式-学习笔记
- Vue自定义指令拖拽功能示例
- 解决vue组件中使用v-for出现告警问题及v for指令介
- swagger上传文件并支持jwt认证的实现方法
- axios中cookie跨域及相关配置示例详解