`
- 浏览:
427 次
- 性别:
- 来自:
北京
-
一世天才——分享
题目三
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
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
JavaScript变量作用域及内存问题是一个非常重要的概念,在编程过程中起着至关重要的作用。本文将对JavaScript变量作用域、内存问题以及相关的操作技巧进行深入的分析。 首先,我们需要了解变量作用域的相关知识。在...
### 不同浏览器JavaScript变量作用域的处理方法 #### 一、引言 JavaScript是一种广泛使用的脚本语言,它被设计用于网页开发,并逐渐扩展到服务器端编程和其他领域。JavaScript的作用域规则是理解其行为的关键之一,...
在词法作用域的分析中,我们可以通过几个小例子来深入了解词法作用域的机理。例如,在以下代码中: ```javascript function a(i) { var i; alert(i); a(i); } a(10); ``` 在上面的代码中,我们定义了一个函数a...
在大多数编程语言中,对象的作用域主要有以下几种类型: 1. **全局作用域**:在所有函数和类外部定义的对象,可以在程序的任何地方被访问。全局对象在整个程序运行期间都存在,直到程序结束。 2. **局部作用域**:...
本篇将详细解释JavaScript作用域的几个核心特性,包括无块级作用域、函数作用域、作用域链以及作用域链的创建时间。 1. 无块级作用域 不同于Java或C#,JavaScript并没有块级作用域,这意味着在JavaScript中,大括号...
在深入理解JavaScript作用域时,我们需要关注以下几个关键知识点: 1. **全局作用域**:这是程序中默认的作用域,任何在函数外部声明的变量都属于全局作用域,可以在整个代码的任何地方被访问。全局作用域中的变量...
在JavaScript编程语言中,变量和作用...总的来说,理解JavaScript中的函数定义、调用、参数处理、变量作用域和安全实践是编写高效、安全代码的基础。掌握这些概念可以帮助开发者编写出更加灵活和可靠的JavaScript代码。
变量作用域“一个变量的作用域表示这个变量存在的上下文。它指定了你可以访问哪些变量以及你是否有权限访问某个变量。” 变量作用域分为局部作用域和全局作用域。 局部变量(处于函数级别的作用域)不像其他对面对象...
说起变量第一个要说到的肯定就是作用域,正是因为不熟悉JS的作用域,往往就会把面向对象的作用域张冠李戴,毕竟有些东西总是习惯性的这样,但是并不是每次照搬都是可以的,那么下一个问题就来了,js到底是什么作用...
本文将通过对几个具体例子的分析来探讨JavaScript作用域链的基本原理及其工作方式。 #### 二、从一个简单的问题说起 考虑以下JavaScript代码: ```javascript var arg = 1; function fucTest(arg) { alert(arg)...
变量作用域决定了变量在何处可以被访问。主要有以下几种类型的作用域: 1. **全局作用域**:在所有函数外部定义的变量拥有全局作用域,它们在整个程序中都可访问。例如: ```python x = 10 def print_x(): print...
在JavaScript中,闭包(Closure)是一个极其关键的概念,它使得内部函数能够访问到其外部函数的作用域内的变量,即使外部函数已经执行完毕。这一特性是基于JavaScript的函数作用域规则以及函数本身可以作为值进行...
- **变量提升(Hoisting)**:`var`声明的变量会被提升到当前作用域的顶部,这可能导致预期外的行为,而`let`和`const`则不会出现这个问题。 - **使用`window`对象**:在浏览器环境中,全局变量实质上是`window`...
JavaScript中有以下几种变量作用域: 1. **表达式**:表达式通常不创建变量作用域,但在ES6引入的箭头函数中,表达式式的函数体可以访问其外部作用域中的变量。 2. **语句级作用域**:JavaScript实际上并没有语句...
闭包是JavaScript中一个高级概念,它允许一个函数记住并访问它外部作用域中的变量,即使该函数在其外部作用域之外执行也是如此。 ##### 1. 闭包的定义 闭包是由函数和与其相关的引用环境组合而成的实体,这个环境...
作用域是JavaScript中一个非常核心的概念,它决定了代码块中变量和函数的可访问性。全局作用域中的变量和函数可以被整个程序中的其他代码所访问,而局部作用域则限制了变量和函数的可访问范围到代码块内部。在...
在javascript中有全局作用域和局部作用域,但是没有块级作用域,局部变量的优先级高于全局变量,通过几个示例来了解下javascript中作用域的那些“潜规则”(这些也是在前端面试中经常问到的问题)。 1. 变量声明...