js当一个变量为函数时 应该注意的一点细节小结
var testFun=function (name,age){
var job='Flash Develop';
return new testFun.init(name,age,job);
}
testFun.init=function(name,age,job){
return 'name:'+name+',age:'+age+',job:'+job+'';
}
alert(testFun('vincent',30)); //[object Object]
代码很简单,变量testFun为一个匿名函数,匿名函数返回的一个testFun.init对象(也是一个匿名函数)。但对于一些新手有时会误解为:testFun是返回的一个testFun.init对象。他可能会这样想,在匿名函数function(name,age)构建过程中,又用到了testFun. 此时testFun还在构建中,应该还没有存在,testFun.init更没有存在,怎么就可以用testFun.init呢?
其实这样想是存在了一个误区:把testFun与testFun()等同起来了,如果testFun是返回的一个testFun.init对象,代码应该是testFun=function(name,age){… …}()。正确的理解应该是这样的,testFun只是一个函数,当你把一个函数赋于它时,它就已经存在了,哪怕函数返回的是undefined或null,它本身仍然是Function,只有testFun()执行后返回值才是undefined或null。返回值是testFun()执行的结果,结果返回后,就不再与testFun有任何关系。如:
代码如下:
var testFun=function(){
return undefined;
}
var result=testFun();
alert(testFun); // function () {return undefined;}
alert(result); // undefined result与testFun不再有任何关系
所以,当赋于testFun一个匿名函数后,它就一直存在着,直到赋于它另外一个值。对于testFun.init你可以这样简单的去理解:
testFun.init=function(name,age){}.init=function(name,age.job){… …}
综上所述,回头再看testFun是一个函数,而testFun()则是(function(name,age,job){return 'name:'+name+',age:'+age+',job:'+job+''; })()
为了便于理解,可以把代码精简为:
代码如下:
var testFun=function(){}
testFun.init=function(){}
只是testFun()没有返回一个testFun.init对象罢了。
相关推荐
-
js变量以及其作用域详解
一.变量的类型 Javascript和Java.C这些语言不同,它是一种无类型.弱检测的语言.它对变量的定义并不需要声明变量类型,我们只要通过赋值的形式,可以将各种类型的数据赋值给同一个变量.例如: 复制代码 代码如下: i=100;//Number类型 i="variable";//String类型 i={x:4};//Object类型 i=[1,2,3];//Array类型 JS的这种特性虽然让我们的编码更加灵活,但也带来了一个弊端,不利于Debug,编译器的弱检测让我们维护冗长的
-
有关js的变量作用域和this指针的讨论
一.变量作用域:[P71] 这一句话说的非常精辟:"在ECMAScript中,只有两种执行环境,全局环境和函数环境,每个函数都是一个执行环境,包括嵌套函数.换句话说,其他情况下即使变量声明在一对大括号中,在括号外部仍然可以访问这些变量".以下给出例子: 复制代码 代码如下: for(var i=0; i<5; i++) { var num = 20; // 在for语句中声明的变量 } alert(num); // 在for语句外部调用变量,仍然可以得到num的值 对异常语句也同
-
javascript 调用其他页面的js函数或变量的脚本
调用函数.变量的方法一样,都是需要首先获得你需要调用的函数所在的window对象,然后通过window.method()或者 window.variable 来调用. 下面的示例演示了一个弹出窗口如何调用起父窗口中的方法和变量. 父窗口:1.html 我们 www.jb51.net 其它页面js变量调用方法代码 var theHelloStr = "Hello all."; function sayHello() { alert("hello, method")
-
js 变量类型转换常用函数与代码[比较全]
1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有对String类型调用这些方法,这两个函数才能正确运行:对其他类型返回的都是NaN(Not a Number). 在判断字符串是否是数字值前,parseInt()和parseFloat()都会仔细分析该字符串.parseInt()方法首先查看位置0处的 字符,判断它是否是个有效数字:如果不是,该方法将返回NaN,不再继续执行其他操作.但如果该字符是有效数字,该方法
-
js函数内变量的作用域分析
本文实例分析了js函数内变量的作用域.分享给大家供大家参考.具体分析如下: 先看一个函数实例: 复制代码 代码如下: <html> <head> </head> <body> <script type="text/javascript"> var a = 5; var c = 3; function t(){ var a = 6; var b = 10; document.write(a+'-----'+b); doc
-
js 多种变量定义(对象直接量,数组直接量和函数直接量)
对象直接量创建一个对象: 复制代码 代码如下: var obj = {x:[1,2],y:23}; 代码跟下面是一样的. 复制代码 代码如下: var obj=new Object(); obj.x=new Array(1,2); obj.y=23; 测试: 复制代码 代码如下: for(var i in obj) alert(obj[i]); 函数直接量:它是一个表达式而不是语句. 复制代码 代码如下: (function(){})() 如下例: 复制代码 代码如下: (function(){
-
js 判断js函数、变量是否存在的简单示例代码
核心代码 //是否存在指定函数 function isExitsFunction(funcName) { try { if (typeof(eval(funcName)) == "function") { return true; } } catch(e) {} return false; } //是否存在指定变量 function isExitsVariable(variableName) { try { if (typeof(variableName) == "undef
-
js变量、作用域及内存详解
基本类型值有:undefined,NUll,Boolean,Number和String,这些类型分别在内存中占有固定的大小空间,他们的值保存在栈空间,我们通过按值来访问的. (1)值类型:数值.布尔值.null.undefined. (2)引用类型:对象.数组.函数. 如果赋值的是引用类型的值,则必须在堆内存中为这个值分配空间.由于这种值的大小不固定(对象有很多属性和方法),因此不能把他们保存到栈内存中.但内存地址大小是固定的,因此可以将内存地址保存在栈内存中. <script type="
-
js变量作用域及可访问性的探讨
每一种语言都有变量的概念,变量是用来存储信息的一个元素.比如下面这个函数: 复制代码 代码如下: function Student(name,age,from) { this.name = name; this.age = age; this.from = from; this.ToString = function() { return "my information is name: "+this.name+",age : "+t
-
js当一个变量为函数时 应该注意的一点细节小结
先看一段简单的代码: 复制代码 代码如下: var testFun=function (name,age){ var job='Flash Develop'; return new testFun.init(name,age,job); } testFun.init=function(name,age,job){ return 'name:'+name+',age:'+age+',job:'+job+''; } alert(testFun('vincent',30)); //[object Ob
-
js中判断变量类型函数typeof的用法总结
1.作用: typeof 运算符返回一个用来表示表达式的数据类型的字符串. 可能的字符串有:"number"."string"."boolean"."object"."function" 和 "undefined". 2.常用返回值说明 表达式 返回值 typeof undefined 'undefined' typeof null 'object' typeof true 'boole
-
JS中的Replace()传入函数时的用法详解
replace方法的语法是:stringObj.replace(rgExp, replaceText) 其中stringObj是字符串(string),reExp可以是正则表达式对象(RegExp)也可以是字符串(string),replaceText是替代查找到的字符串.. 废话不多说了,直接给大家贴代码了,具体代码如下所示: <script> var str = "a1ba2b"; var reg = /a.b/g; str = str.replace(reg,func
-
JS中的变量作用域(console版)
作用域说明:指一个变量的作用范围 1.全局作用域 (1) 全局作用域在页面打开时被创建,页面关闭时被销毁 (2) 编写在script标签中的变量和函数,作用域为全局,在页面的任意位置都可以访问到 (3) 在全局作用域中有全局对象window,代表一个浏览器窗口,由浏览器创建,可以直接调用 (4) 全局作用域中声明的变量和函数会作为window对象的属性和方法保存 var a = 10; b = 20; function an(){ console.log('an') } var bn = fun
-
介绍一些PHP判断变量的函数
虽然这一特点使用PHP编程非常容易,但它也存在一个重要的缺陷:当你需要测试一个变量的类型时,处理类型比较松散的语言就让人有些迷惑.幸运地是,PHP的开发者注意到这一情况,因此在其中包含了一个函数工具包,特别用它来测试变量并查明它们属于哪个特定的字符类别--也就是说,它们是否包含字符串.整数.对象或布尔值. 下面列出了这一类别中较为有用的函数,并提供说明与应用实例. empty($var) 这个函数用来检查变量是否为空(没有值或零值).用此函数来检查用户输入,例如,表格变量.保证它们包含有效数据.
-
js 作用域和变量详解
一.说起变量的提升呢,首先我们先看一段简单的代码 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script> var v = 'hello world'; alert(v); </script&
-
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
在项目开发过程中,也许你会遇这样的情况. 在某一Js文件中需要完成某一功能,但这一功能的大部分代码在另外一个Js文件中已经完成了,自己只需要调用这个方法再加上几句代码就可以实现所需的功能. 我们知道,在html中,利用<script language="javascript" type="text/javascript" src="./script.js"></script>引入的两个js是不可以相互调用的.那么该如何解决
-
浅谈js中的变量名和函数名重名
今天骚凯问了一道变量名冲突的题目,感觉很有意思,顺便也复习一下预解析的一些知识,有不对的地方忘前辈大神指正,题目是这样的: var a=100; function a(){ console.log(a); } a(); 这个串代码执行完会报错 : a is not a function 问题来了,为什么会报这个错误呢? 这里涉及到函数和变量的预解析: 1)函数声明会置顶 2)变量声明也会置顶 3)函数声明比变量声明更置顶:(函数在变量上面) 4)变量和赋值语句一起书写,在js引擎解析时,会将其拆
-
基于js里调用函数时,函数名带括号和不带括号的区别
示例代码: <span style="font-size:18px;">function hi(){ var a = 1; return function(){ console.log(a++); }; }; var aaa = hi(); var bbb = hi; </span> 如以上代码: aaa 是将 hi() 的运行结果赋值给它,即 return 返回的匿名函数,此时有一个闭包,则每次调用 aaa 时都访问的同一个 a,aaa() 第一次运行结果为
-
浅谈js中调用函数时加不加括号的问题
其实总结起来如下: 函数只要是要调用它进行执行的,都必须加括号.此时,函数()实际上等于函数的返回值.当然,有些没有返回值,但已经执行了函数体内的行为,这个是根本,就是说,只要加括号的,就代表将会执行函数体代码. 不加括号的,都是把函数名称作为函数的指针,用于传参,此时不是得到函数的结果,因为不会运行函数体代码.它只是传递了函数体所在的地址位置,在需要的时候好找到函数体去执行. 所以一般时候我们都是采用的是无括号的原因.这也是由于括号的二义性,因为括号是"函数调用运算符",相当于在执行
随机推荐
- 整理AngularJS中的一些常用指令
- 因插入了一张扩展卡 我的RM970红屏的解决方法
- java中Calendar类用法实例详解
- Java 虚拟机(JVM)之基本概念详解
- .net下log4net使用方法详解
- Javascript 遍历页面text控件详解
- 使用Promise链式调用解决多个异步回调的问题
- php常用字符串处理函数实例分析
- 获取上一页面的URL和本页的URL的方法
- Android自定义view实现阻尼效果的加载动画
- C#编程简单实现生成PDF文档的方法示例
- Node.js的基本知识简单汇总
- 95%的中国网站需要重写CSS
- jQuery实现的表格展开伸缩效果实例
- Python自动连接ssh的方法
- Android应用的Material设计的布局兼容性的一些要点总结
- JavaScript组件开发之输入框加候选框
- 使用apachetop实时监控日志、动态分析服务器运行状态
- 完善CodeIgniter在IDE中代码提示功能的方法
- 使用SpringBoot开发Restful服务实现增删改查功能