0

I've looked a fair bit, so pardon me if this has already been answered.

I'm also curious as to what the actual term is called; Is it "Ambiguous" for the type of arguments I am handling?

Anyways, the problem is that I want to be able to call a function like this:

prompt(_.define(variable, "DEFAULT VALUE")); 

Basically, so that variables can have default values.

However, every time I try to do this, I get this error:

Timestamp: 6/11/2012 1:27:38 PM
Error: ReferenceError: thisvarisnotset is not defined
Source File: http://localhost/js/framework.js?theme=login
Line: 12

Here is the source code:

function _() {
return this;
};

(function(__) {
__.defined = function(vrb, def) {
    return typeof vrb === "undefined" ? ((typeof def === "undefined") ? null : def) : vrb;
    };
})(_());


prompt(_.defined(thisvarisnotset, "This should work?"), "Can you see this input?");

Not sure why it's doing this? I've called undefined variables as arguments in functions before and it worked just fine.

4
  • Yeah, you can't do this in javascript. Commented Jun 11, 2012 at 17:44
  • variable = variable || 'default'; Commented Jun 11, 2012 at 17:50
  • var variable = variable || 'default'; would be better, since you don't know if variable is initialised yet. Otherwise, you will be initialising variable in the global scope. Commented Jun 11, 2012 at 17:56
  • Thanks, that makes things a little bit more simple than what I was previously doing, the (var || 'default'). I didn't know that you can not pass undefined variables that way, I figured that the function would automatically assign it as undefined if it was. Thank you! Commented Jun 11, 2012 at 18:08

2 Answers 2

1

A completely undeclared variable can't be passed in JS; you can only pass declared variables or undeclared properties of other variables.

In other words:

var a; // you can do _.defined(a)
var a = undefined; // you can do _.defined(a)
a.b; // you can do _.defined(a.b), even though we never defined b
Sign up to request clarification or add additional context in comments.

9 Comments

To fix your code, one option is to do this all the time "window.thisvarisnotset"; since window is the global scope, this should work. Of course, it bears mentioning that you're almost trying to create a new variant of JS here; good luck to anyone else who has to work with your code.
If thisvarisnotset if not declared elsewhere, it will refer to window.thisvarisnotset. This doesn't solve the problem though.
Oh, good point. Yeah, really you're trying to change JS, and that can't be done. The much more JS-ish solution to this, as ddlshack mentioned, is to just do "thisvarisnotset || defaultValue" everywhere, instead of even trying to define a function like the one you're trying to make.
(Well, and even MORE JS-ish solution would be to restructure your code so that it doesn't rely on ambiguously declared variables in the first place ...)
(... the foo || default pattern is useful, and you'll find it used in major libraries like jQuery, but you should only need it in a few specific situations; not so much that you feel like you need to make a function. If you do feel like you need it a lot, there's probably a better way to do what you're trying to accomplish.)
|
1

Basically, so that variables can have default values.

Why don't you just initialize the variable with a default value?

Or, just initialise the variable before calling defined.

var variable; // Note that this will not overwrite the variable if it is already set.

Or, even better.

var variable = variable || 'default';

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.