一些js小题,掌握这些对于一些常见的面试、笔试题应该很有帮助:

        var a=10;
function aa(){
alert(a);
}
function bb(){
aa();
}
bb();//10 因为bb函数调用aa时,程序在执行aa,执行aa时只能找到全局中的a:10

当函数中声明变量不加var时则为全局变量:

function test(){
var a=b=10;
}
test(); //切记:一定要执行
alert(b);//全局 10
alert(a);//报错,因为定义在函数内部,有var,属于函数内的变量,外部无法访问

优先使用内部的变量,没有再往上查找,直到找到window,若还没有则出错,说明变量没有声明,如下:

        var a=10;
function aa(){
var a=20;
alert(a);
}
aa();//20 优先使用自身定义的var a=20,而不用再往上搜索全局

但倘若把var a=20;放到alert(a);之后,则会undefined,例如下面代码:

        var a=10;
function aa(){ alert(a);
var a=20;//放在了alert(a);之后
}
aa(); //undefined

这个问题之前也让我百思不得其解,现在我终于懂了,函数在读取变量时有个“预加载”特性。之所以弹出undefined很明显是没找到,为什么没找到呢?原来是函数执行时已经知道函数内部已经定义了var a;了,这时就不会再往上查找全局(把后路堵死了),但当执行到alert(a);时 还有没执行到var a=20;也就是说此时的a还没有被赋值,所以爆出undefined。总结就是:只要声明了var a=20;无论位置在哪,都不会再往上查找,还没来得及赋值就被alert了。代码就相当于:

	var a=10;
function aa(){
var a; //已经声明有a就不会再往上查找
alert(a);//执行时还未声明
a=20; //赋值已经晚了。已经爆出undefined了!
}
aa();//undefined

那如果把函数内部的var a=10;的var 去掉呢?请看代码?

var a=10;
function test(){
a=20; //去掉了var,a也变为全局
alert(a);
}
test(); //20

很明显结果是20,给人的错觉是直接使用了内部的a=20,其实这样理解是错的,因为没有var,a变为全局,对函数来说内部是没有a的,会向上查找a,很高兴的找到了var a=10;没错,刚找到时依然为10,然后把a的值也就是10带入函数内部后,发现:尼玛!函数里有a=20;这条代码,就这样丢掉a的原值10,重新使用20,这样再被弹出。于是乎我们就看到了20,这个20可不是直接从内部拿来用的,而是从外面溜了一圈后才使用的20。

内部环境可使用外部的变量,外部变量不能使用内部的:

var a=10;
function aa(){
function bb(){
var a=20;
alert(a);//此处负责弹出bb自己本身的a :20
}
bb();
alert(a);//此处负责弹出全局中的10 }
aa(); //先弹出20,再弹出10

都知道函数中return后面的代码永远不会执行(不知道的面壁),但也不要太粗心,因为对于函数声明来说有个特性就是提前执行,也就是会把函数声明的代码放到代码块顶端优先执行,这样哪怕该类函数是放在return后面依然会执行,并且在return前就执行:

                (function f(){
function f(){alert('1');}
return f(); //函数声明有提前执行的作用,也就是在return(虽然return后面的代码不执行)
function f(){alert('2');}
function f(){alert('3');}
function f(){alert('4');}//函数声明提前执行,f()已经被一次次更新
alert('sss');//永远不会执行因为在return后的代码不执行(匿名函数除外)
})() //4
以上代码执行结果为4,因为前面的函数都被最后一个重写(函数名一样),且在return之前执行,但最后一句alert('sss');永远不会执行,因为它没有像函数声明一样的提前执行待遇,并且位置处在return后面,被无情的抛弃,永远不会执行。

关于引用型数据:

先来了非引用数据吧:

var a=1;
var b=a;
b++; //更改b 加1
alert(b); //2 弹出更改后的b
alert(a);//1 不变,也就是说b的改变不影响a

但引用型数据就不行了:

var a=[1,2,3];
var b=a;
b.push(4); //修改b
alert(b);//1234 改变
alert(a);//1234 也改变,说明两者共同使用一个引用,共同指向一个内存区域,一个修改,另一个也跟着改

上面代码只是修改b,那如果对b重新赋值呢?

var a=[1,2,3];
var b=a;
b=[4,5,6];
alert(b);//456
alert(a);//123 不变

随着b的重新复制,那么就切断了引用,另立门户,和a再也没有任何关系。

当全局变量以参数的方式传进函数内部后,在内部对变量的操作就不再影响外部的全局,但引用同样不符合这条规则。

先来段非引用:

        var a=10;
function test(a){
a=a+3;
alert(a);// 负责弹出传进函数内部且被修改后的a,值为13 }
test(a); //负责弹出全局中的10,说明全局没有被修改
alert(a); //先弹出13,后弹出10

以上原理注释中已经说明,如果去掉传参的方式呢?

        var a=10;
function test(){
a=a+3;
alert(a);//13
}
test(a); //13
alert(a); //结果13, 13

没有传进参数,a就被函数内部修改(内部有权使用外部变量)。

引用型哪怕以传参的方式依然会影响外部变量:

var a=[1,2,3];   //引用型传进之后在函数内部改变依然影响函数外部
function test(a){
a.push(4);
alert(a)
}
test(a); //1,2,3,4
alert(a); // 1,2,3,4 全局变量已经被影响

以上代码证明引用型哪怕用参数传入也一样会牵连。当然了如果重新赋值(不是用push修改)会切断引用,彻底取消牵连:

var a=[1,2,3];   //引用型传进之后在函数内部改变依然影响函数外部
function test(a){
a=[3,3,3,3,3,3]; //重新复制则不再受外界影响,因为赋值切断了引用
alert(a)
}
test(a); //3,3,3,3,3,3
alert(a); // 1,2,3 不再受影响

这些就是常见的面试题考查的知识点,把这些掌握能解决很多类型的面试题,希望对你有所帮助,一起努力。

一些js小题(一)的更多相关文章

  1. 常让人误解的一道js小题

    一道小题引发的深思 今天无意中看到一个js笔试题,不由得想起初学js那会被各种题目狂虐的心酸,虽说现在也会被笔试题所虐,但毕竟比之前好了很多,下面就是我的个人理解,欢迎拍砖.指正: var x = 1 ...

  2. 第24篇 js小知识和“坑”

    前面说了说了js的相关知识,基本上除了语法外,把项目常用的知识做了一个梳理,现在说下js的其它方面的知识,这些知识不成体系,属于不理解对于一般开发没什么太多影响,但如果理解清楚,可以更好去开发. js ...

  3. JS编程题练习

    JS编程题练习 1. 两个数组合并成一个数组排序返回 先依次比较两个数组,按照小的就传入新的数组.当这次比较完之后可能有一个数组的长度很长,留下一些数组,然后在新数组的末尾插入即可. function ...

  4. js小功能整理

    /** * 判断是否包含字符串某字符串 * @param {[type]} str [被检测的字符串] * @param {[type]} substr [检测是否含有的字符串] * @return ...

  5. [转载]Js小技巧||给input type=“password”的输入框赋默认值

    http://www.cnblogs.com/Raywang80s/archive/2012/12/06/2804459.html [转载]Js小技巧||给input type="passw ...

  6. 用js刷题的一些坑

    leecode可以用js刷题了,我大js越来越被认可了是吧.但是刷题中会因为忽略js的一些特性掉入坑里.我这里总结一下我掉过的坑. 坑1:js中数组对象是引用对象 js中除了object还有数组对象也 ...

  7. React.js 小书介绍

    React.js 小书 Github 关于作者 这是一本关于 React.js 的小书. 因为工作中一直在使用 React.js,也一直以来想总结一下自己关于 React.js 的一些知识.经验.于是 ...

  8. 关于理解python类的小题

    今天看了python部落翻译的一篇<一道python类的小题>文章,感觉挺有启发性,记录下来: print('A') class Person(object): print('B') de ...

  9. 一个js小游戏----总结

    花了大概一天左右的功夫实现了一个js小游戏的基本功能,类似于“雷电”那样的小游戏,实现了随即怪物发生器,碰撞检测,运动等等都实现了,下一个功能是子弹轨迹,还有其他一些扩展功能,没有用库,也没有用web ...

随机推荐

  1. Oracle数据库入门——物化视图日志结构

    物化视图的快速刷新要求基本必须建立物化视图日志,这篇文章简单描述一下物化视图日志中各个字段的含义和用途. 物化视图日志的名称为MLOG$_后面跟基表的名称,如果表名的长度超过20位,则只取前20位,当 ...

  2. C2C,B2C,F2C三种电商运营模式的比较

      第三方模式(C2C) 销售商模式(B2C) 生产商模式(F2C) 概念及简介 第三方平台提供商模式是电子商务的最原始也是最自然的形式.这种模式一般都是由信息技术开发商负责建立平台,利用平台扩展电子 ...

  3. wireshark使用笔记

    tcp && (ip.src==xxx.xxx.xxx.xxx || ip.dst==yyy.yyy.yyy.yyy)

  4. JAVA字节码解析

    Java字节码指令 Java 字节码指令及javap 使用说明 ### java字节码指令列表 字节码 助记符 指令含义 0x00 nop 什么都不做 0x01 aconst_null 将null推送 ...

  5. Google首席软件工程师Joshua Bloch谈如何设计一款优秀的API【附PPT】

    编者按]随着近来软件规模的日益庞大,API编程接口的设计变的越来越重要.良好的接口设计可以降低系统各部分之间的相互依赖,提高组成单元的内聚性,降低组成单元间的耦合度,从而提高系统的维护性和稳定性. J ...

  6. Entity Framework访问MySQL数据库的存储过程并获取返回值

      一.创建MySql存储过程 1, CREATE PROCEDURE `InsertAlarmInfo`(in businessindex int, in providerindex int, in ...

  7. Linux下查看tcp连接数及状态

    netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’ TIME_WAIT 8947FIN_WAIT1 15FIN_W ...

  8. MVC过滤器中获取实体类属性值

    本文地址:http://www.cnblogs.com/outtamyhead/p/3616913.html,转载请保留本地址! 最近在项目遇到了这个问题:获取Action行参中实体类的属性值,主要的 ...

  9. codeforces George and Job

    /* 题意:给一个长度为n的序列, 从中选择长度为m的k个区间(任意两个区间不会有公共部分) 使得所选择的区间的和最大! 思路:这是一种很常见的dp dp[i][j] 表示的是前 i 个数选择 j 个 ...

  10. 受限玻尔兹曼机(RBM)学习笔记(六)对比散度算法

      去年 6 月份写的博文<Yusuke Sugomori 的 C 语言 Deep Learning 程序解读>是囫囵吞枣地读完一个关于 DBN 算法的开源代码后的笔记,当时对其中涉及的算 ...