`
电商在路上
  • 浏览: 427 次
  • 性别: 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变量作用域及内存问题实例分析

    JavaScript变量作用域及内存问题是一个非常重要的概念,在编程过程中起着至关重要的作用。本文将对JavaScript变量作用域、内存问题以及相关的操作技巧进行深入的分析。 首先,我们需要了解变量作用域的相关知识。在...

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

    ### 不同浏览器JavaScript变量作用域的处理方法 #### 一、引言 JavaScript是一种广泛使用的脚本语言,它被设计用于网页开发,并逐渐扩展到服务器端编程和其他领域。JavaScript的作用域规则是理解其行为的关键之一,...

    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到底是什么作用...

    javascript作用域链(Scope Chain)初探.docx

    本文将通过对几个具体例子的分析来探讨JavaScript作用域链的基本原理及其工作方式。 #### 二、从一个简单的问题说起 考虑以下JavaScript代码: ```javascript var arg = 1; function fucTest(arg) { alert(arg)...

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

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

    JavaScript 中的闭包是指内部函数可以访问外部函数作用域中的变量

    在JavaScript中,闭包(Closure)是一个极其关键的概念,它使得内部函数能够访问到其外部函数的作用域内的变量,即使外部函数已经执行完毕。这一特性是基于JavaScript的函数作用域规则以及函数本身可以作为值进行...

    JavaScript声明全局变量访问方法

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

    javascript语言的模块化.

    JavaScript中有以下几种变量作用域: 1. **表达式**:表达式通常不创建变量作用域,但在ES6引入的箭头函数中,表达式式的函数体可以访问其外部作用域中的变量。 2. **语句级作用域**:JavaScript实际上并没有语句...

    JS的作用域与闭包

    闭包是JavaScript中一个高级概念,它允许一个函数记住并访问它外部作用域中的变量,即使该函数在其外部作用域之外执行也是如此。 ##### 1. 闭包的定义 闭包是由函数和与其相关的引用环境组合而成的实体,这个环境...

    图解Javascript——作用域、作用域链、闭包

    作用域是JavaScript中一个非常核心的概念,它决定了代码块中变量和函数的可访问性。全局作用域中的变量和函数可以被整个程序中的其他代码所访问,而局部作用域则限制了变量和函数的可访问范围到代码块内部。在...

    深入理解javascript作用域和闭包

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

Global site tag (gtag.js) - Google Analytics