`
电商在路上
  • 浏览: 409 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

javascript变量作用域几个头疼的问题

阅读更多
一世天才——分享
题目三
JavaScript代码
1alert(name);  //name下面才定义,这里肯定报错了吧?错!这里弹出:undefined 
2var name = ‘casper’; 
解释:javascript代码在解析的时候,都会搜索下var声明的变量,并将其声明提前,实际的过程如下:
JavaScript代码
3var name;  //光声明name变量,但未赋值,所以为此时为:undefined 
4alert(name);  
5name = ‘casper’; 

题目四
JavaScript代码
6var name = ‘casper’; 
7function show(){ 
8    alert(name); 
9    name = ‘hello’;  //全局变量name的值改为’hello’ 
10} 
11show();  //输出:casper 

题目五
JavaScript代码
12var name = ‘casper’; 
13function show(){ 
14    alert(name);  //输出:undefined,是不是有想死的心 
15    var name = ‘hello’;  //注意:与题目四相比,此处name前多了个var, 
16} 
17show(); 
解释:在函数show中,name是个局部变量,题目三的原理同样适用于此,即函数show内部实际为
(小知识点补充:当函数内部存在与外部全局变量同名的局部变量,优先使用局部变量,此处为name)
JavaScript代码
18function show(){ 
19    var name; 
20    alert(name); 
21    name = ‘hello’; 
22} 

题目六
JavaScript代码
23var list = [1,2,3]; 
24function show(){ 
25    if(typeof list === ‘undefined’){ 
26        list = []; 
27    } 
28    alert(list.length); 
29}; 
30show();  //结果:3,是不是一目了然= =,稍等,请接着看第七题 

题目七
JavaScript代码
31var list = [1,2,3]; 
32function show(){ 
33    if(typeof list === ‘undefined’){ 
34        var list = [];  //请注意,与题目六相比,这里多了个var 
35    } 
36    alert(list.length); 
37}; 
38show();  //结果:0,是不是突然有了想死的冲动 
解释:javascript没有块级作用域(即由{}限定的作用域),函数中声明的所有变量,无论在哪里声明,在整个函数中都是有定义的,这点跟C++等灰常不同,赶紧扭转思想与时俱进
于是,再来看下show方法实际的内部解析逻辑
JavaScript代码
39function show(){ 
40    var list;  //list为局部变量,且此处尚未赋值 
41    if(typeof list === ‘undefined’){ 
42        list = []; 
43    } 
44    alert(list.length); 
45}; 

题目八
JavaScript代码
46alert(typeof show);  //结果:function,请相信你的眼睛,你没有看错 
47function show(){} 
解释:javascript代码解析的过程,类似 function show() 这种形式声明的函数,跟var声明的变量一样,都会被提到最前面,不同的是,函数声明跟定义同时完成,但var声明的变量的赋值在后面才会完成

题目九
JavaScript代码
48alert(typeof show);  //结果:undefined,请再次擦亮你的眼睛,你的确没有看错 
49var show = function(){}; 
解释:采用函数定义式以及函数表达式定义函数,两者过程之间存在一些区别
函数定义式:function show(){}
函数表达式:var show = function(){}
采用函数定义式声明的方法,函数的定义会提前;而采用函数表达式声明的方法,函数的定义,跟采用var声明的局部变量一样,函数声明会提前,但函数定义位置不变,过程如下:
JavaScript代码
50var show; 
51alert(typeof show); 
52show = function(){}; 


题目十
JavaScript代码
53var data = {name:‘casper’}; 
54function data(){ 
55    alert(‘casper’); 
56} 
57data();  //TypeError: object is not a function 
更正:在火狐浏览器中,结果是弹出 casper 的警告框!
而在chrome和IE9中,的确提示说data是一个对象,而不是一个函数
是不是有砸显示器的冲动。。。data此时其实为{name:’casper’},把一个object当函数调用,于是报错了
前面说过,函数声明(通过函数定义式)、var声明的变量会被提前,但是会有先后顺序之分,如下:
JavaScript代码
58function data(){ 
59    alert(‘casper’); 
60} 
61var data; 
62data = {name:‘casper’}; 
63data(); 

JavaScript代码
64//略微修改下,结果就不同鸟: 
65 
66var data = {name:‘casper’}; 
67var data = function (){  //通过函数表达式声明函数 
68    alert(‘casper’); 
69} 
70data();  //结果:casper 
71 
72//结合上文不难猜想过程如下: 
73 
74var data; 
75data = {name:‘casper’}; 
76data = function (){ 
77    alert(‘casper’); 
78} 
79data();  //结果:casper
分享到:
评论

相关推荐

    Javascript的词法作用域分析.pdf

    在词法作用域的分析中,我们可以通过几个小例子来深入了解词法作用域的机理。例如,在以下代码中: ```javascript function a(i) { var i; alert(i); a(i); } a(10); ``` 在上面的代码中,我们定义了一个函数a...

    第四章示例代码__对象的作用域

    在大多数编程语言中,对象的作用域主要有以下几种类型: 1. **全局作用域**:在所有函数和类外部定义的对象,可以在程序的任何地方被访问。全局对象在整个程序运行期间都存在,直到程序结束。 2. **局部作用域**:...

    JavaScript作用域示例详解_.docx

    本篇将详细解释JavaScript作用域的几个核心特性,包括无块级作用域、函数作用域、作用域链以及作用域链的创建时间。 1. 无块级作用域 不同于Java或C#,JavaScript并没有块级作用域,这意味着在JavaScript中,大括号...

    深入理解JavaScript作用域共12页.pdf.zip

    在深入理解JavaScript作用域时,我们需要关注以下几个关键知识点: 1. **全局作用域**:这是程序中默认的作用域,任何在函数外部声明的变量都属于全局作用域,可以在整个代码的任何地方被访问。全局作用域中的变量...

    JavaScript 基础函数_深化剖析变量和作用域_.docx

    在JavaScript编程语言中,变量和作用...总的来说,理解JavaScript中的函数定义、调用、参数处理、变量作用域和安全实践是编写高效、安全代码的基础。掌握这些概念可以帮助开发者编写出更加灵活和可靠的JavaScript代码。

    javascript中的变量作用域以及变量提升详细介绍

    变量作用域“一个变量的作用域表示这个变量存在的上下文。它指定了你可以访问哪些变量以及你是否有权限访问某个变量。” 变量作用域分为局部作用域和全局作用域。 局部变量(处于函数级别的作用域)不像其他对面对象...

    Javascript变量的作用域和作用域链详解

     说起变量第一个要说到的肯定就是作用域,正是因为不熟悉JS的作用域,往往就会把面向对象的作用域张冠李戴,毕竟有些东西总是习惯性的这样,但是并不是每次照搬都是可以的,那么下一个问题就来了,js到底是什么作用...

    3.8 函数参数与变量的作用域(ppt).zip

    变量作用域决定了变量在何处可以被访问。主要有以下几种类型的作用域: 1. **全局作用域**:在所有函数外部定义的变量拥有全局作用域,它们在整个程序中都可访问。例如: ```python x = 10 def print_x(): print...

    不同浏览器javascript变量作用域的处理方法

    关于变量作用域,和IE,firefox对js的不同处理,这里有几个例子,有几个是原来从别处看到的记的笔记,有的是我自己挖掘出来的. 2.1 [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]2.2  [Ctrl+A 全选 注:如需引入...

    JavaScript声明全局变量访问方法

    - **变量提升(Hoisting)**:`var`声明的变量会被提升到当前作用域的顶部,这可能导致预期外的行为,而`let`和`const`则不会出现这个问题。 - **使用`window`对象**:在浏览器环境中,全局变量实质上是`window`...

    JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例

    [removed]变量的声明以下是几种声明变量的方式 代码如下: var...细节:所以大家创建变量都尽量使用Var //变量的作用域(这个问题也容易出,大家要搞明白)[removed]变量的作用域 这些都是细节,和我一样初学的一定要注

    深入理解javascript作用域和闭包

    在javascript中有全局作用域和局部作用域,但是没有块级作用域,局部变量的优先级高于全局变量,通过几个示例来了解下javascript中作用域的那些“潜规则”(这些也是在前端面试中经常问到的问题)。 1. 变量声明...

    JavaScript制作的几个简单网页

    作用域决定了变量的可见范围,而闭包则允许函数访问并操作其外部作用域的变量,是JavaScript中一个强大的特性。 最后,虽然这个项目没有提及CSS,但要知道JavaScript可以与CSS结合,通过操作元素的style属性或者...

    Js作用域和this关键字1

    当在函数内部访问一个变量时,JavaScript会先在当前作用域查找,如果没有找到,则向上一级父作用域查找,直到找到全局作用域。如果仍然没有找到,就会抛出错误。这个查找过程形成了作用域链。 ```javascript foo = ...

    javascript权威指南 学习笔记之变量作用域分享

    //声明,并且赋值,即定义了 下面是几点总结: 变量的作用域:全局的和局部的。(注意:如果尝试读取一个未声明的变量的值,javascript会生成一个错误) 第一点:在都使用var关键字修饰变量的情况下,如果给一个局部...

    有关js的变量作用域和this指针的讨论

    在JavaScript编程语言中,变量作用域和`this`指针是理解代码逻辑和正确执行上下文的关键概念。本文将深入探讨这两个主题。 首先,我们来详细解析变量作用域。在ECMAScript规范中,变量作用域决定了变量在哪里可以被...

    JavaScript 深入学习【词法结构值类型和变量】

    以上只是JavaScript词法结构和值类型、变量的基础知识,更深入的学习还涉及到作用域、闭包、原型链、异步编程、Promise、async/await等高级主题。对于JavaScript的深入学习,理解这些概念并结合实际编程实践是非常...

    浅析JavaScript中的变量复制、参数传递和作用域链

    今天学习笔记主要有这样几个关键字:变量、参数传递、执行环境、变量对象、作用域链。  1.变量  变量需要注意的有两点:变量声明和复制变量值。  变量声明肯定大家都很熟悉,在JS中我们都是通过 var 关键字...

    JavaScript中的作用域链和闭包

    作用域 全局作用域 局部作用域 作用域链 执行上下文 活动对象 闭包 闭包优化 JavaScript中出现了一个以前没学过的概念——闭包。何为闭包?从表面理解即封闭的包,与作用域有关。所以,说闭包以前先说说作用域。 ...

Global site tag (gtag.js) - Google Analytics