javascript变量作用域问题

发布于 2022-09-02 01:02:54 字数 248 浏览 22 评论 0

Image

我定义了一个Cat类,在里面添加了三个私有变量,然后用原型的方式给这个类添加了displayinfo方法,问题是为什么这个方法访问不到该类的私有变量?

谢谢大家伙的回答,现在回头看看以前提问的问题真是有点太简单了,哈哈。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

陌路黄昏 2022-09-09 01:02:54

F12控制台,不明白的地方打上断点。

clipboard.png

重新加载,F11跳入函数执行处,同时右手边查看scope,并在watch挂上cat

clipboard.png

函数执行完成(出栈)

clipboard.png

F11继续,cat发生变化,

clipboard.png

这个时候调用cat.displayInfo(),怎么可能访问到那些变量?

把Cat里的var全部改成this调试

clipboard.png

思念绕指尖 2022-09-09 01:02:54
var Cat=function(age,color,sex){
    var age=1;
    var color=2;
    var sex=3;
}
Cat.prototype.displayInfo=function(){
    console.log(color+''+age+''+sex);
}
var cat=new Cat('11');
cat.displayInfo();

1) JS中变量的作用域在函数中
2)函数声明时,如果定义的形参,那么JS解析器将自动为函数声明对应名字的内部变量(私有变量),默认值为undefined
3)一个声明过的变量重复声明是无效的
4)函数的内部变量只能在函数内部访问或通过闭包访问
5)如果一个函数内部变量没有再内部声明过或不在闭包作用域中,那么就会到全局作用域中查找,如果还是没有找到那么会报错ReferenceError: XXX is not defined
6) 当一个函数作为构造函数通过new操作符创建一个对象时,将会自动新建一个带有原型的对象赋值给this,你可以通过给this也就是新建的对象定义创建新的属性,在构造函数执行完毕后将新建的对象赋值给实例对象变量,题目中的cat变量
7) 为实例对象设置的属性不是私有的,外部依然可以访问到并且可以被删除(如果属性没有被配置过不可修改的话)

按上面个的描述
1)在构造函数中的var age/var color/var sex是无效声明,赋值有效
2)如果想为通过new操作符构建的实例对象设置属性,请使用this关键字
3)执行cat.displayInfo();将会报错~~ReferenceError: XXX is not defined

如果想正确运行

var Cat=function(age,color,sex){
    this.age=age;
    this.color=color;
    this.sex=sex;
}
Cat.prototype.displayInfo=function(){
    console.log('color:%s,age:%s sex:%s',this.color,this.age,this.sex);
}
var cat=new Cat('11');
cat.displayInfo();
console.log('AGE:%s',cat.age);
背叛残局 2022-09-09 01:02:54

那三个不叫私有变量,它们叫局部变量

千寻… 2022-09-09 01:02:54
var Cat = function(age, color, sex){
    this.age = typeof age != "string" ? "xxxx" : age;
    this.color = color || "no color";
    this.sex = sex || "no sex";
}
Cat.prototype.displayInfo = function(){
    console.log(this.color+" "+this.sex+" "+this.age);
}

试试这样?
至于为什么这个方法访问不到该类的私有变量?其实你只要打印一下cat你就会发现var和this的区别,更详细的自己网上找找吧。

你如我软肋 2022-09-09 01:02:54

要用this。

冬天旳寂寞 2022-09-09 01:02:54

你输出什么对象的变量呢,你完全没有在原型创建里指向呀

混浊又暗下来 2022-09-09 01:02:54

你可以通过放在闭包里面,访问里面的局部变量

(function(){
    var _age;
    var _color;
    var _sex;
    
    function Cat(age,color,sex){
        _age = typeof age != "string" ? "xxxx" : age;
        _color = color || "no color";
        _sex = sex || "no sex";
    }
    
    Cat.prototype.displayInfo=function(){
        console.log(_color+','+_sex+','+_age);
    }
    
    var cat = new Cat('11');
    cat.displayInfo();
})();
注定孤独终老 2022-09-09 01:02:54

我觉得提问者应该把它看成一个原型继承问题而不是变量作用域问题

梦旅人picnic 2022-09-09 01:02:54

看prototype 和 proto

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文