`
zhouyrt
  • 浏览: 1163359 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

具名函数的四种调用方式(2)

阅读更多

以函数中有无this来讨论。没有this时返回一个空的对象{},有this时返回一个非空对象。

 

定义一个没有this的函数

 

//返回值是基本类型
function fun() {
	return "jack";
}

var c = new fun();
for (var atr in c) {
	alert(atr);
} 
alert(c);//[object Object]

 

返回值c不是"jack", 从for in执行后没有输出任何属性可以看出 c 是一个空的对象{}。

 

再看看有this的函数,函数中有this实际上是在写一个类。但由于js的灵活性,造成了许多诡异的写法。

 

//返回值是基本类型
function fun() {
	this.name = "tom";
	return "jack";
}

var c = new fun();
for (var atr in c) {
	alert(atr);//name
} 
alert(c.name);//tom
 

返回值也不是"jack",for in输出了name属性,最后一句输出了tom,说明返回值 c 是一个非空对象。这里的return "jack"压根没起作用。所以当函数返回值是内置类型(基本类型)时,用new方式调用函数将会导致错误的结果

 

那么当函数返回值是一个对象,数组,函数呢?

 

//不含this,返回值是一个对象
function fun() {
	//组装一个对象
	var obj = {};
	obj.name = 'andy';
	obj.age = 20;
	obj.msg = function(){}
	
	return obj;
}

var c = new fun();
for (var atr in c) {
	alert(atr);//name,age,msg
} 
alert(c.name);//andy
 
//含this,返回值是一个对象
function fun() {
	this.sex = "man";
	//组装一个对象
	var obj = {};
	obj.name = 'andy';
	obj.age = 20;
	obj.msg = function(){}
	
	return obj;
}

var c = new fun();
for (var atr in c) {
	alert(atr);//name,age,msg
} 
alert(c.name);//andy

 

 

两段的输出结果是一样的,c都含有name,age,msg属性而不含sex属性。说明当返回值是对象类型(对象,数组,函数)时,new不会用this去构造对象,而直接返回组装的对象。

 

这种方式实际上是工厂方式,在应用中更多的程序员把函数名首字母大写,让它看起来更像一个类。

 

 

 

 

分享到:
评论

相关推荐

    JavaScript中具名函数的多种调用方式总结

    JavaScript中的具名函数有多种调用方式,本文将总结其中的四种方法,主要包括普通函数调用、使用call方法、使用apply方法以及使用new关键字调用。 首先,最常见也是最直接的函数调用方式是使用圆括号()。这通常是在...

    javascript 具名函数的四种调用方式 推荐第1/3页

    总结来说,这四种函数调用方式在很多情况下执行结果看起来没有区别,但是在函数返回值存在时,它们的行为表现会有所不同。特别是new关键字调用,它涉及到构造函数的创建和this的绑定,对于返回值的处理也会因返回值...

    js函数调用的方式

    (4)没有引用的匿名函数调用2 代码如下: (function() { })();   (5)没有引用的匿名函数调用3 代码如下: void function() { }(); 图1.1,图1.2表明了这两种表达式的运算过程是不一样的,图1.1中是用强制...

    手动回调函数

    回调函数在计算机编程中是一种设计模式,它允许你将一个函数作为参数传递给另一个函数,以便在特定条件或事件发生时被调用。在VB(Visual Basic)中,虽然不直接支持函数指针,但可以通过一些技巧实现类似的功能。本...

    一本关于JavaScript中函数式编程的书

    在JavaScript中,`map()`、`filter()`和`reduce()`等函数就是常见的高阶函数示例,它们可以用于操作数组,提供了一种抽象和复用代码的方式。 四、函数组合 函数组合是将两个或更多函数串联起来,形成一个新的函数。...

    Labview 调用Bartender打印标签,bartender标签打印教程,LabView

    2. **创建具名数据源**:在Bartender中,你可以为每个需要动态更新的数据字段创建具名数据源。例如,如果你的标签需要打印产品ID和生产日期,那么这两个字段就可以分别设置为不同的具名数据源。这样做可以让LabVIEW...

    Android-KatzKotlin的函数数据类型和抽象

    函数还可以接受具名参数,这在处理复杂函数时特别有用,因为它允许调用者明确指定参数的值。例如,`fun greet(name: String, age: Int) { println("Hello, $name! You are $age years old.") }`,调用时可以写成`...

    4. 函数1

    - `defer`后的函数调用会在函数返回之前执行,这有助于保持代码整洁,特别是在需要成对操作(如打开/关闭,连接/断开)的情况下。`defer`的调用顺序遵循“后进先出”(LIFO),类似于栈的性质。 9. **利用闭包改变...

    javascript函数自制手册

    函数表达式是另一种定义函数的方式,它包括匿名函数(没有函数名)和具名函数表达式。例如: ```javascript var anonymous = function() { console.log('I am anonymous'); }(); function named() { console.log...

    JavaScript的函数声明与应用

    此外,JavaScript的箭头函数(Arrow Function)提供了一种更简洁的函数定义方式,特别是在处理回调函数时。例如: ```javascript var sayHello = () => console.log('Hello, world!'); ``` 箭头函数有两点需要注意...

    JS定义函数的几种常用方法小结

    具名函数表达式是在赋值时指定函数名,而匿名函数表达式则没有名称。函数表达式赋值给变量后,变量名实际上指向了函数对象。示例如下: ```javascript // 具名函数表达式 var greet = function greeting(greeting, ...

    js匿名函数作为函数参数详解

    在JavaScript(简称js)编程中,函数是一等公民,这意味着函数可以像其他值一样被赋给变量、作为参数...在这种情况下,建议根据情况将匿名函数定义为具名函数,并抽取到独立的作用域中,以提高代码的可读性和可维护性。

    PYTHON学习教程资源:匿名函数.docx

    匿名函数是 Python 中的一种特殊函数,顾名思义,它不需要具名定义,可以直接使用 lambda 关键字来定义。匿名函数的特点是可以直接传入函数中,而不需要事先定义函数名。这使得代码看起来更加简洁和灵活。 匿名函数...

    javascript 用函数语句和表达式定义函数的区别详解

    - **具名函数表达式**:虽然函数表达式通常匿名,但也可以为函数提供一个内部名称,如`function innerName() {...}`。这种情况下,`innerName`只在函数体内部可见,不能在外部访问。 总结来说,函数语句和函数...

    C++计算器实现.zip

    2、最近不具名表达式的简单调用 不具名表达式可使用_调用,规则如下: _或_0调用最近的一个不具名表达式。 _1则调用次近的一个不具名表达式。 以此类推。 3、计算命令 以$()为准,括号内的即为需要计算的式子。...

    C++调用Bartender模板进行打印标签

    1. **初始化Bartender对象**:在C++中,你需要创建一个 Bartender 对象实例,通常通过CoCreateInstance函数实现。例如: ```cpp CoInitialize(NULL); IDispatch* pBarTender = NULL; HRESULT hr = ...

    JavaScript中的函数声明和函数表达式区别浅析

    具名函数表达式除了定义一个函数之外,还可以在函数内部通过函数名调用自身,这在递归调用时特别有用。 当函数表达式出现在赋值表达式的一部分时,如 `var foo = function() {}`,或被包含在分组操作符中(即被一对...

Global site tag (gtag.js) - Google Analytics