js function随笔
function test () {c=5;alert(c); } test();
当我们在执行test函数时,浏览器并不会报c未定义的错误,因为在js中,变量定义是通过var关键字,如果没有通过var定义,而直接进行引用,js引擎会自动把这个c定义为全局变量。
unction test () {c=5;alert(c); }test();(function test2 () {alert(c) })();
所以test2函数也可以拿到这个c。
function test2 () {alert(c);console.log(c);var c=2;}
test2();
这个js引擎在编译时会先将c定义,但是不会给他赋值,赋值要在函数执行的时候,所以不会报c is not defined
但是c会赋值为undefined
今天参加了一场面试,面试过程中做了三道js的笔试题,题目只记得了大概了,不过也没关系。
var a=1;var obj={b:2}function fn(){}fn.c=6;function test(a,obj,fn){a=3;obj.b=4;fn.c=5}test(a,obj,fn)alert(a);alert(obj.b);alert(fn.c);alert(a+obj.b+fn.c);
大意就是这样吧!问最后alert(a+obj.b+fn.c);的值会是多少!大家不妨先自己分析分析。答案是10。a等于1,obj.b等于4,fn.c等于5。分析如下
首先基本类型的传递方式为按值传递,也就是说test(a,obj,fn),中的a是全局变量的一个拷贝,在这个test函数里面改变a的值是不会影响外面全局变量a的值的,所以全局变量a的值依然是1,而对象是按引用类型传递的,也就是test函数中的obj参数,传递的将是指向该对象的一个引用。(感觉就像c里面的指针,传递的是一个指向某个内存的地址指针,通过该指针来找到对应的内存地址,不知道这个比方打的正不正确)。那么我们在函数里面改变obj.b实际上是会改变全局变量中obj.b的值的,而fn.c也是一个道理,因为在js中函数也是对象。那么很自然就得到了10.建议大家去了解一下按值传递和按引用传递的相关内容,高程里面好像有。
还有一个题目
var name="djl";function echo(){alert(name);var name="eve";//就是变量的申明提前,但是只是执行了var name;但是此时是并没有给name赋值的,也就是说没有执行name="eve"; alert(name);alert(age);}echo();
因为学的如果不深入的话很肯能会得到 djl,eve,语法错误这样的答案。但实际上是undefined,eve,语法错误。因为我们知道在js中有变量申明提升的特性。
就比如
alert(a); var a;
我们会得到undefined,而不是js引擎报错 “Uncaught ReferenceError: a is not defined”。但是我们应该还要注意,变量申明确实提升了,但是却并不会执行赋值操作,也就是说我们在后面定义var a=1;js引擎提升的部分只有var a;在提升申明的过程中并不会执行a=1这个赋值操作。所以在上面var name="eve";只会提升申明,并不会在此时执行name="eve"的赋值操作,所alert的结果为undefined而不是eve也不是djl或者报错。
当然以上是我个人理解,感觉更好理解点。这里还有大神的理解(有点难懂):
http://www.laruence.com/2009/05/28/863.html
http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html
转载于:https://www.cnblogs.com/djlxs/p/5068483.html
js function随笔相关推荐
- js function定义函数的4种方法
js function定义函数的4种方法 1.最基本的作为一个本本分分的函数声明使用. 复制代码代码如下: 复制代码代码如下: function func(){} 或 var func=funct ...
- js function后面小括号
js function后面小括号 function后面小括号有小括号为立即调用函数 立即调用函数 function后面小括号有小括号为立即调用函数 立即调用函数 IIFE (Immediately I ...
- js php mysql 是b,MySQL_BBS(php mysql)完整版(七),//下面是 top.js function KB_kee - phpStudy...
BBS(php & mysql)完整版(七) //下面是 top.js function KB_keepItInIE(theName,theWantTop,theWantLeft) { the ...
- 网易云课堂Nodejs笔记(js Function,css,写法)
网易云课堂Nodejs笔记(js Function,css) CSS position ---网页定位 margin ---元素外边距 padding ---元素内边距 nth-child()选择器 ...
- js Function对象扩展与延时执行函数实例代码
网页特效 function对象扩展与延时执行函数实例代码 function.prototype.delay=function(this1,timeout){ this1=this1||null; ti ...
- node.js学习随笔
Node的文件和文件系统API位于fs模块中: var fs=require("fs")//加载文件系统API 同步读取文件,通过传递编码获得文本而非字节: var text = ...
- js function如何传入参数未字符串_Python爬虫 JS 案例讲解:爬取漫画
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于Python爬虫案例,作者麦自香 转载地址 https://blo ...
- JS function立即调用的几种写法
//立即执行 (function () { alert(1) })() //立即执行 !function () { alert(1) }() //立即执行 +function () { alert(1 ...
- js function如何传入参数未字符串_JavaScript 学习之路- JS 小测验
在学习 JS 的过程中,很多知识往往看一遍就过去了,然后自以为掌握了,其实再次碰到不一定能答得出来,看到一些有趣的东西还是要动手实践一下,而且时不时复习一下,非常有利于加深记忆.今天是五一,假日期间, ...
最新文章
- java多线程实现方法
- 【Android 异步操作】线程池 ( 线程池作用 | 线程池种类 | 线程池工作机制 | 线程池任务调度源码解析 )
- linux中文件名有英文括号的问题
- Mybatis查询日期范围
- Golang 入门笔记(二)下
- C++ 类的抽象初练
- android 实现打开相册
- linux下4g显卡可以挖矿吗,文件不断扩大,ETH矿工即将面临重大抉择问题
- [小结]InnoDB体系结构及工作原理
- Gulp,grunt,seajs/require和browserify/webpack的区别
- gist.github.com 被墙无法访问解决办法
- 【扩频通信】基于matlab扩频通信Gold序列特性仿真【含Matlab源码 1522期】
- C++中cin,cin.get()和cin.getline()的区别
- laravel项目出现Non-static method Redis::hGet() cannot be called statically的解决方法
- 移动硬盘格式化了,要怎么恢复数据
- php脉聊交友源码_脉聊源码-PHP脉聊交友网站源码(附app源码)下载-西西软件下载...
- php theexcerpt,wordpress函数get_comment_excerpt()用法示例
- js通用判断指定日期是周几,是否是周六、周日
- matlab设置线条颜色宽度线型
- 【CTF】LFI漏洞总结(PHP本地文件包含漏洞)