看下js变量、作用域、内存文档。

1.

<script type="text/javascript">
function c(){
return 23;
}
var a=c;
var b=c();
alert(typeof a);//function
alert(typeof b);//number
   alert(typeof c);//function
   alert(typeof c());//number
</script>

如果函数c里没有return,则typeof b的结果是undefined。

函数定义:声明 表达式

var f=function d(){
return 3;
}
alert(typeof f);//function
alert(typeof d());//Error 没有输出结果
var ff=function(){
}//函数表达式,上边f=function d(){}写法不对

2.

var msg='hello';
for (var i=0; i<10; i++)
{
var msg='hello'+i*2+i;
}
alert(msg); //hello189

3.

var bb = 1;
function aa(bb) {
bb = 2;
alert(bb);
};
aa(bb);//
alert(bb);//

函数aa内的bb是参数变量,不会影响外部bb的值。

4.

var a,b;
(function(){//自执行函数
alert(a);//undefined
alert(b);//undefined
var a=b=3;
alert(a);//3 在函数内部相当于给ab赋值3
alert(b);//
})();
alert(a);//undefined 在函数外部
alert(b);//3 在函数外部 自执行函数内的var a=b=3相当于b=3,b相当于全局变量了,所以能访问到

非常不建议不使用var就初始化变量,因为这种方法会导致各种意外发生

5.简单的闭包-js匿名函数和闭包文档

参考:http://www.jb51.net/article/24101.htm

function Foo() {
alert("i");
var i = 0;
return function() {
console.log(i++);
}
} var f1 = Foo(), f2 = Foo();
f1();
f1();
f1();
f2();
//控制台输出结果:0 1 2 3 0

闭包:在函数外部获得函数内部局部变量的一种方法。

function a(){
var num=3;
return function b(){
alert(num);
num++;
}
}
var m=a();
m();//
m();//
var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      return function(){
        return this.name;
     };
    }
};
alert(object.getNameFunc()()); //The Window var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
     return this.name;
    }
};
alert(object.getNameFunc()); //My Object"

6.

在闭包中使用this对象也可能会导致一些问题,this对象是在运行时基于函数的执行环境绑定的,如果this在全局范围就是window,如果在对象内部就指向这个对象。而闭包却在运行时指向window的,因为闭包并不属于这个对象的属性或方法

(function box() {    //自执行-封装成表达式  (内容)(参数)
alert('Lee');
})();
(function box(n) {//自执行-封装成表达式 (内容)(参数)
alert(n);//输出word
})("word");
//相当于如下形式,只不过fn是不存在的
var fn=function(n){
};
fn("word");

这里就要说一次(function($){})(jQuery)和$(function(){})了

(function($){})(jQuery)形式同上,定义一个参数为$的匿名函数,并将jQuery作为参数来调用这个匿名函数。简单理解是用来定义一些需要预先定义好的函数。执行时dom不一定存在;

$(function(){})则是在dom加载完成后来执行预先定义好的函数。用于存放操作dom对象的代码,执行代码的时候dom对象是已经存在的。

简单的插件写法示意:

(function($){
$.fn.tabSwitch=function(){};
$.fn.menuSelect=function(){};
})(jQuery);

引用:

$(function(){
$.fn.tabSwitch();
})

7.

html

<ul>
<li>1</li><li>2</li><li>3</li>
</ul>

javascript

var Li=document.getElementsByTagName("li");
var ll=Li.length;
for(i=0;i<ll;i++){
Li[i].onclick=function(){
alert(i);
}
}

依次点击li输出:3,3,3

刚开始只是注册了一个事件处理函数,点击事件触发函数执行alert(i),而此时的i=4,在点击事件发生之前循环已经结束。

//循环里包含匿名函数
function box() {
var arr = []; for (var i = 0; i < 5; i++) {
arr[i] = function () {
return i;
};
}
return arr;
} var b = box(); //得到函数数组
alert(b.length); //得到函数集合长度
for (var i = 0; i < b.length; i++) {
alert(b[i]()); //输出每个函数的值,都是最后一个值
}

这是作用域链的机制导致一个问题,在循环中里的匿名函数取得的任何变量都是最后一个值。

上面的例子输出的结果都是5,也就是循环后得到的最大的i值。因为b[i]调用的是匿名函数,匿名函数并没有自我执行,等到调用的时候,box()已执行完毕,i早已变成5,所以最终的结果就是5个5。

//循环里包含匿名函数-改1,自我执行匿名函数
function box() {
var arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = (function (num) { //自我执行
return num;
})(i); //并且传参
}
return arr;
}
var b = box();
for (var i = 0; i < b.length; i++) {
alert(b[i]); //这里返回的是数组,直接打印即可
}

改1中,让匿名函数进行自我执行,导致最终返回给a[i]的是数组而不是函数了。最终导致b[0]-b[4]中保留了0,1,2,3,4的值。

//循环里包含匿名函数-改2,匿名函数下再做个匿名函数
function box() {
var arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = (function (num) {
return function () {//直接返回值,改2变成返回函数
return num;//原理和改1一样
}
})(i);
}
return arr;
}
var b = box();
for (var i = 0; i < b.length; i++) {
alert(b[i]());//这里通过b[i]()函数调用即可
}

改1和改2中,我们通过匿名函数自我执行,立即把结果赋值给a[i]。每一个i,是调用方通过按值传递的,所以最终返回的都是指定的递增的i。而不是box()函数里的i。

8.

console.log(1+ "2"+"2");
console.log(1+ +"2"+"2");
console.log("A"- "B"+"2");
console.log("A"- "B"+2);

输出:122 32 NaN2 NaN

加法:有一个操作数是字符串就拼成字符串输出。

一元加:+“2”会将字符串转换成数值,所有1++“2”结果为数值3,3+“2”有一个操作数是字符串,最终是字符串。如果有一个操作数是NaN则加法结果是NaN, 不过如果有一个操作数是字符串,应该遵循:如果两个都是字符串-拼接,如果一个是字符串,则把另一个转换成字符串拼接。

减法:如果操作数是字符串 null undefined 布尔值,则调用Number()。减法操作:如果有一个操作数是NaN则减法操作结果为NaN。"A"-"B"不能转换成数值,结果为NaN;NaN+"2",一个操作数是字符串,转换nan为字符串,输出NaN2。

js返回值的更多相关文章

  1. Python3.x:Selenium+PhantomJS爬取带Ajax、Js的网页及获取JS返回值

    前言 现在很多网站的都大量使用JavaScript,或者使用了Ajax技术.这样在网页加载完成后,url虽然不改变但是网页的DOM元素内容却可以动态的变化.如果处理这种网页是还用requests库或者 ...

  2. js返回值 数组去重

    function myfun(arr){ var arr1 = new Array(); var len = arr.length; ;i <len ;i++){ ) { arr1.push(a ...

  3. a标签根据js返回值判断页面是否跳转

    a标签再跳转之前先判断是否符合条件,符合可以跳转,不符合不可以跳转. 自己遇到的问题是:在js方法中根据条件就return结果,但是不行. 原因是:在js方法中return后不会结束整个js方法(ac ...

  4. cef3 获得js 返回值, 以及js 指挥delphi 函数的 总结参考

     cef3  如何加载 本地html 文件.   请教老师[吐槽]常忘<run_fan@qq.com>  22:21:45@lazarus 下载cef3中的范例中就有  [吐槽]常忘< ...

  5. WebView调用js方法获取返回值的完美解决方案

    在Android项目中我们或多或少会涉及到与js交互的问题,这其中WebView是必须掌握的控件,今天主要说说我们通过WebView调用js方法,然后如何很好的获取返回值.这里我总结了三种方式,大家可 ...

  6. 最近见到的JS返回函数的一些题

    JS返回值题一直都是考察重点,面试和笔试之中也经常涉及到,说一说我最近遇到的一些有意思的JS返回函数问题. 之前见到过一道有意思的问题,说有一个sum函数,用户可以通过sum(2,3)来取到2+3 = ...

  7. JS函数 -- 功能,语法,返回值,匿名函数,自调用匿名函数,全局变量与局部变量,arguments的使用

    “JavaScript设计得最出色的就是它的函数的实现.” -- <JavaScript语言精粹> 函数包含一组语句,它们是JS的基础模块单元,用于指定对象的行为.一般来说,所谓编程,就是 ...

  8. springmvc下js控制表单提交(表单提交前检验,提交后获取json返回值)

    这个问题我搞了四天,终于搞懂.因为对js很不熟悉.郁闷的是后台代码出错总可以设置断点调试,前端js代码出错只能通过浏览器提供一些运行数据来分析,很不习惯. 首先说下逻辑:这是一个注册功能,我希望,注册 ...

  9. JSF页面中使用js函数回调后台bean方法并获取返回值的方法

    由于primefaces在国内使用的并不是太多,因此,国内对jsf做系统.详细的介绍的资料很少,即使有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚至还是错误的, ...

随机推荐

  1. poj 2431

    大意: 有n个加油点,给出每个加油点距离终点的位置和能加多少油,最后一行给出总长度和最初的油量.求最少加几次油能到终点,不能到的话输出-1. Sample Input 4 4 4 5 2 11 5 1 ...

  2. asp.net 2.0 Session丢失问题

    可行的解决方法(本人已用): 1.Web.config文件修改sessionstate模式(默认为InProc) <sessionState mode="/> 2.开启ASP.N ...

  3. python基础之语句结束

    1 2 3 4 5 if a :     if b:          # 这里是if b的作用区间     #这里是if a的作用区间 #这里不在if 区间 python 是按缩进来识别代码块的.

  4. javascript二级联动

    二级联动在一般的网页中随处可见,一般是地址,比如点击浙江省,随后出现的是杭州市,嘉兴市:点击北京省出现的是朝阳,海淀,而不是出现杭州,嘉兴. 要想实现这个步骤,就要用到javascript来实现.其中 ...

  5. java接口的理解

    接口的最主要的作用是达到统一访问,就是在创建对象的时候用接口创建,[接口名] [对象名]=new [实现接口的类],这样你像用哪个类的对象就可以new哪个对象了,不需要改原来的代码,就和你的USB接口 ...

  6. UML中的交互图<转>

      转自>>http://blog.csdn.net/mingxuanyun/article/details/8572128 交互图用来描述系统中的对象是如何进行相互作用的,即一组对象是如 ...

  7. nginx解决502错误

    添加一个域名绑定,突然服务器就挂了.由于是接受项目,没看过服务器配置.结果nginx和mysql 都跑不起来. 平滑启动nginx失败. 检查/usr/local/nginx/sbin/nginx - ...

  8. Promise原理 && 简单实现

    Promise原理 参考https://github.com/chunpu/promise/blob/master/promise.js 个人认为原博的实现有点问题 在next函数的实现上, 会导致无 ...

  9. 又优化了一下 Android ListView 异步加载图片

    写这篇文章并不是教大家怎么样用listview异步加载图片,因为这样的文章在网上已经有很多了,比如这位仁兄写的就很好: http://www.iteye.com/topic/685986 我也是因为看 ...

  10. 设置高级的Logstash 管道

    设置高级的Logstash 管道: 一个Logstash 管道在很多实用例子有一个或者多个输入,filter,和output 插件. 本节中 创建Logstash 配置文件来指定那些插件和讨论每个插件 ...