在jQuery闭包中如何获取window对象的属性描述符?
问题原因与解决方案
你遇到的问题和Object.getOwnPropertyDescriptor()是否正确获取window对象无关,核心原因是变量作用域的差异:
为什么全局环境能拿到,闭包里不行?
- 在浏览器的全局作用域中,用
var声明的变量会自动成为window对象的属性,所以Object.getOwnPropertyDescriptor(window, "otherName")能正常获取到描述符。 - 但在jQuery闭包的函数局部作用域里(比如
$(window).on("load")的回调函数内),var otherName = "ckMe"声明的是函数局部变量,它只存在于当前函数的作用域中,并不会挂载到window对象上。既然window上没有这个属性,Object.getOwnPropertyDescriptor()自然返回undefined。
如何在闭包内实现需求?
根据你的实际需求,有两种解决方式:
1. 把变量显式挂载到window上
如果你确实需要这个变量成为window的属性,直接赋值给window对象即可,不要用var声明:
(function ($) { $(window).on("load", function (event) { window.otherName = "ckMe"; // 直接挂载到window var result = Object.getOwnPropertyDescriptor(window, "otherName"); console.log(result); // 会输出正确的属性描述符 }); }(jQuery));
2. 获取局部变量的描述符(如果不需要挂载到window)
如果只是想查看当前函数局部变量的属性描述符,由于局部变量不是对象的属性,不能直接用Object.getOwnPropertyDescriptor()获取。但你可以把变量放到一个自定义对象中,再获取该对象的属性描述符:
(function ($) { $(window).on("load", function (event) { var scopeObj = { otherName: "ckMe" }; var result = Object.getOwnPropertyDescriptor(scopeObj, "otherName"); console.log(result); // 输出该属性的描述符 }); }(jQuery));
总结一下:你之前的猜测不对,问题出在变量作用域上,闭包里的var声明没有把变量挂到window上,所以window上找不到这个属性。
内容的提问来源于stack exchange,提问作者mustafa mahmud
相关产品推荐
相关产品推荐

