我的代码 -
<script type="application/javascript">
var firstObject = {
sayHello : function(){
document.write("My name is "+ this.myName +"<br>");
},
myName : "Swapnesh Sinha"
};
var secondObject = {myName : "Sanjay Sinha"};
document.write("First one " + firstObject.sayHello() );
document.write("<br>");
document.write("Second one "+ secondObject.myName);
</script>
来源 - http://learn.jquery.com/javascript-101/this-keyword/
期待输出 -
First one Swapnesh Sinha
Second one Sanjay Sinha
意外输出(从我的意义上说) -
My name is Swapnesh Sinha
First one undefined
Second one Sanjay Sinha
让我知道为什么它返回undefined
然而来源提到返回名称?或者我在我身边出错了
答案 0 :(得分:1)
在你的第一个document.write
中,你调用一个函数,并要求将函数的返回值连接到字符串“First one”。
评估该函数,此时“我的名字是Swapnesh Sinha”通过对象内的document.write
调用输出。然而,该函数调用不返回值,因此它是undefined
,并且连接到“First one”,然后打印。
答案 1 :(得分:0)
这是工作小提琴:JsFIDDLE
与大多数jQuery开发人员一样,这是你无法理解的:JavaScript范围。
基本上,为了通过this
访问属性,它必须嵌套在Object.prototype
中。
<强>校正强>
当您内联定义对象属性时,调用this
仍将指向正确的对象。然而,我给你的模式,即使不那么流行,也是一种更整洁,更好的方法。
prototype
是OOP的JavaScript方式。如果您正在寻找可靠的OOP样式JS并且正确定义模型,改进代码可维护性和更好的编码风格,则最好使用我给您的模式定义类,因为它将允许您对静态函数进行强有力的区分和课程。它也是JavaScript的自然流程,一切都是对象。
在高级JavaScript编程(强大的Ajax应用程序或应用程序中,由于某种原因,浏览器必须执行更高级的计算),以下样式始终是首选。放置在命名空间下的静态函数仍然是单独定义的:
var namespace = {};
namespace.firstStaticFunc = function() {/*do stuff etc;*/};
namespace.secondStaticFunc = function() { return !1; };
使用定义模式的唯一原因是枚举和散列映射。例如:
var typesOfChicken = {
RED: 'red',
BLUE: 'blue'
};
以上内容总是用于国际化和避免硬编码值等事情。此外,它有助于JS minifiers更好地工作。鉴于上述情况,您可以说:
console.log(typesOfChicken.RED);// will print red.
console.log("red");// wil still print red
但是,当我想将红色更改为其他内容时,使用枚举我只需要进行一次更改。此外,缩小器可以用a.b替换typesOfChicken.RED
,而"RED"
将始终为“RED”。这是无法实现的。
var firstObject = function() { };
firstObject.prototype.myName = "Swapnesh Sinha";//this will not be nested as an instance property.
firstObject.prototype.sayHello = function() {
alert(this.myName);// will now correctly display Swapnesh Sinha
};
// to use your first object.
var instance = new firstObject();
instance.sayHello();
要正确使用范围,请使用我给你的模式,这是一种面向对象的模式,也是在JS中定义类的正确方法。
现在你有一个很好的方式来组织你的JavaScript代码,它更容易维护,范围更加明显,最重要的是你可以立即区分静态函数和类。
答案 2 :(得分:0)
用sayHello函数中的return替换document.write()