以函数中有无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中的具名函数有多种调用方式,本文将总结其中的四种方法,主要包括普通函数调用、使用call方法、使用apply方法以及使用new关键字调用。 首先,最常见也是最直接的函数调用方式是使用圆括号()。这通常是在...
总结来说,这四种函数调用方式在很多情况下执行结果看起来没有区别,但是在函数返回值存在时,它们的行为表现会有所不同。特别是new关键字调用,它涉及到构造函数的创建和this的绑定,对于返回值的处理也会因返回值...
(4)没有引用的匿名函数调用2 代码如下: (function() { })(); (5)没有引用的匿名函数调用3 代码如下: void function() { }(); 图1.1,图1.2表明了这两种表达式的运算过程是不一样的,图1.1中是用强制...
回调函数在计算机编程中是一种设计模式,它允许你将一个函数作为参数传递给另一个函数,以便在特定条件或事件发生时被调用。在VB(Visual Basic)中,虽然不直接支持函数指针,但可以通过一些技巧实现类似的功能。本...
在JavaScript中,`map()`、`filter()`和`reduce()`等函数就是常见的高阶函数示例,它们可以用于操作数组,提供了一种抽象和复用代码的方式。 四、函数组合 函数组合是将两个或更多函数串联起来,形成一个新的函数。...
函数还可以接受具名参数,这在处理复杂函数时特别有用,因为它允许调用者明确指定参数的值。例如,`fun greet(name: String, age: Int) { println("Hello, $name! You are $age years old.") }`,调用时可以写成`...
2. **创建具名数据源**:在Bartender中,你可以为每个需要动态更新的数据字段创建具名数据源。例如,如果你的标签需要打印产品ID和生产日期,那么这两个字段就可以分别设置为不同的具名数据源。这样做可以让LabVIEW...
- `defer`后的函数调用会在函数返回之前执行,这有助于保持代码整洁,特别是在需要成对操作(如打开/关闭,连接/断开)的情况下。`defer`的调用顺序遵循“后进先出”(LIFO),类似于栈的性质。 9. **利用闭包改变...
函数表达式是另一种定义函数的方式,它包括匿名函数(没有函数名)和具名函数表达式。例如: ```javascript var anonymous = function() { console.log('I am anonymous'); }(); function named() { console.log...
此外,JavaScript的箭头函数(Arrow Function)提供了一种更简洁的函数定义方式,特别是在处理回调函数时。例如: ```javascript var sayHello = () => console.log('Hello, world!'); ``` 箭头函数有两点需要注意...
具名函数表达式是在赋值时指定函数名,而匿名函数表达式则没有名称。函数表达式赋值给变量后,变量名实际上指向了函数对象。示例如下: ```javascript // 具名函数表达式 var greet = function greeting(greeting, ...
在JavaScript(简称js)编程中,函数是一等公民,这意味着函数可以像其他值一样被赋给变量、作为参数...在这种情况下,建议根据情况将匿名函数定义为具名函数,并抽取到独立的作用域中,以提高代码的可读性和可维护性。
匿名函数是 Python 中的一种特殊函数,顾名思义,它不需要具名定义,可以直接使用 lambda 关键字来定义。匿名函数的特点是可以直接传入函数中,而不需要事先定义函数名。这使得代码看起来更加简洁和灵活。 匿名函数...
- **具名函数表达式**:虽然函数表达式通常匿名,但也可以为函数提供一个内部名称,如`function innerName() {...}`。这种情况下,`innerName`只在函数体内部可见,不能在外部访问。 总结来说,函数语句和函数...
2、最近不具名表达式的简单调用 不具名表达式可使用_调用,规则如下: _或_0调用最近的一个不具名表达式。 _1则调用次近的一个不具名表达式。 以此类推。 3、计算命令 以$()为准,括号内的即为需要计算的式子。...
1. **初始化Bartender对象**:在C++中,你需要创建一个 Bartender 对象实例,通常通过CoCreateInstance函数实现。例如: ```cpp CoInitialize(NULL); IDispatch* pBarTender = NULL; HRESULT hr = ...
具名函数表达式除了定义一个函数之外,还可以在函数内部通过函数名调用自身,这在递归调用时特别有用。 当函数表达式出现在赋值表达式的一部分时,如 `var foo = function() {}`,或被包含在分组操作符中(即被一对...